개발자

리액트에서 전역상태를 컴포넌트의 렌더링에 맞춰서 initial 값을 주려면 어떻게 하면 좋을까요

2023년 04월 11일조회 297

상태 관리 라이브러리로는 zustand를 사용하고 있습니다. 지금 생각나는 것은 context provider와 useEffect 정도인데, useEffect는 이전 값이 남아있어 렌더링 시 잔상이 보이는 문제가 있더라고요 ㅠㅠ 그래서 useefftect return에도 setter를 넣어줬는데.. 혹시 다른 방법이 있을까 싶어서.. 질문 드립니다. 컴포넌트 생성 시와 종료에 맞춰 값을 변경해주고 싶은 상황입니다.

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 2

윤성연님의 프로필 사진

컴포넌트의 마운트 시점에 전역 컨텍스트에 값을 set 하고, 그값을 동시에 렌더링 하고 싶으시다고 이해가 됩니다. zustand 를 사용해보진 않았지만, 의견을 남겨봅니다. 해당 컴포넌트가 전역상태를 구독하고 있고, 마운트 시점에 setter 로 값을 할당하게 되면 업데이트 시점이 늦어져서 빈화면이 보이게 되는 문제 같습니다. 이렇게되면 setter 를 호출하는 시점에서부터 컴포넌트의 Render Phase가 되기전에 값을 할당할수가 없을것 같습니다. 값이 비어있을때 엘리먼트를 return 하지 않게 하거나 로더, 스켈레톤 UI 등을 사용해서 잠시 비어있는 화면을 채워 두는 방법도 가능할것 같습니다. 도움이 되진 않겠지만 useEffect 대신 useLayoutEffect 를 사용하면 Render Phase 에 진입하기 전에 useLayoutEffect 의 콜백함수가 실행됩니다. 그렇다고 하더라도 상태를 업데이트 하는 과정이 들어있다면 컴포넌트가 렌더링 된후 상태가 업데이트 되며 리렌더링 하게 될수 있습니다. 가급적이면 사용할 전역 상태에 초기값을 가지고 있을수 있도록 설계 해주시거나, 상위 컴포넌트에서 props 로 데이터만 해당 컴포넌트로 보내주는 방법이 좋을것 같습니다.

profile picture

익명

작성자

2023년 04월 13일

의견 감사합니다! 많이 배워 갑니다 🙏

커리어리 AI 봇님의 프로필 사진

컴포넌트가 생성되거나 종료될 때 전역 상태를 업데이트하려면, ' useEffect '를 사용하여 컴포넌트가 마운트되거나 언마운트 될 때 필요한 액션을 수행하는 것이 좋습니다. 이전 값이 남아있어 렌더링 시 잔상이 보이는 문제를 해결하기 위해, 컴포넌트가 언마운트 될 때 초기 상태를 설정하는 것이 중요합니다. 여기서는 ' zustand '를 사용하고 있으므로, 상태 관리를 위한 커스텀 훅을 사용하여 필요한 동작을 수행할 수 있습니다. 아래는 예제 코드입니다. 1. 먼저, ' zustand '를 사용하여 전역 상태 관리를 설정하세요. 2. 그런 다음, 컴포넌트에서 ' useEffect '를 사용하여 컴포넌트가 마운트될 때 데이터를 설정하고 언마운트 될 때 데이터를 초기화하세요. 이 방법을 사용하면 컴포넌트 생성 시와 종료에 맞춰 전역 상태 값을 변경할 수 있습니다. 이렇게 하면 렌더링 시 이전 값이 남아있는 문제도 해결됩니다. ----- ✅ Chat GPT의 답변을 평가해 주세요! 틀린 내용은 없는지, 답변이 도움이 되었는지 댓글로 작성해 주세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#1
import create from 'zustand';

const useGlobalState = create((set) => ({
  data: null,
  setData: (newData) => set({ data: newData }),
  resetData: () => set({ data: null }),
}));


#2
import React, { useEffect } from 'react';
import useGlobalState from './useGlobalState';

const MyComponent = () => {
  const { setData, resetData } = useGlobalState();

  useEffect(() => {
    setData({ ... }); // 초기 데이터를 설정합니다.

    return () => {
      resetData(); // 컴포넌트가 언마운트될 때 데이터를 초기화합니다.
    };
  }, []); // 빈 배열을 의존성으로 전달하여 useEffect를 마운트 및 언마운트 시에만 실행되도록 합니다.

  // 컴포넌트 렌더링 로직...
};

export default MyComponent;

커리어리 AI 봇의 답변을 평가해 주세요!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!