"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 관련되지 않은 React 구성 요소 간의 상태 공유

관련되지 않은 React 구성 요소 간의 상태 공유

2024-08-07에 게시됨
검색:341

React 구성요소 간에 직렬화 가능한 데이터를 공유하는 방법을 보여주고 싶습니다. NextJS의 클라이언트 구성 요소.

관련되지 않은 구성요소가 거의 없습니다.

Example app UI

초기 상태를 포함할 객체를 만들어 보겠습니다.

export const state: { count: number } = { count: 0 };

Map이나 WeakMap에 데이터를 저장할 수 있으며 상태는 데이터에 액세스하는 데 중요한 역할을 합니다. 또한 가입자 배열이 필요합니다.

const stateMap = new WeakMap();
const subscribers: (() => void)[] = [];

이제 데이터 변경 사항을 구독하는 후크를 작성해 보겠습니다.

export function useCommonState(stateObj: T) {
  // more efficient than `useEffect` since we don't have any deps
  React.useInsertionEffect(() => {
    const cb = () => {
      const val = stateMap.get(stateObj);
      _setState(val!);
    };
    // subscribe to events
    subscribers.push(cb);

    return () => {
      subscribers.slice(subscribers.indexOf(cb), 1);
    };
  }, []);
}

이제 상태 가져오기 및 설정과 관련된 논리를 추가해 보겠습니다.

  // all instances of hook will point to same object reference
  const [state, _setState] = React.useState(() => {
    const val = stateMap.get(stateObj) as T;
    if (!val) {
      stateMap.set(stateObj, stateObj)
      return stateObj
    }
    return val
  });

  const setState = React.useCallback((newVal: object) => {
    // update value
    stateMap.set(stateObj, newVal);
    // notify all other hook instances
    subscribers.forEach((sub) => sub());
  }, []);

  return { state, setState };

이제 다음과 같은 3가지 구성요소에서 사용할 수 있습니다.

import { state as myState } from './state';
//...

const { state, setState } = useCommonState(myState);


// ...
Component A
Count: {state.count}

Final app

여기에서 어떻게 작동하는지 확인할 수 있습니다 https://stackblitz.com/~/github.com/asmyshlyaev177/react-common-state-example
또는 여기 https://codesandbox.io/p/github/asmyshlyaev177/react-common-state-example/main
또는 github https://github.com/asmyshlyaev177/react-common-state-example

이 원칙에 따라 NextJS에 대한 내 라이브러리를 확인하세요 https://github.com/asmyshlyaev177/state-in-url

읽기용 Tnx입니다.

릴리스 선언문 이 글은 https://dev.to/asmyshlyaev177/sharing-state-between-un관련-react-comComponents-4aia?1에서 복제됩니다.1 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3