ホームページ > ウェブフロントエンド > jsチュートリアル > 無関係な React コンポーネント間での状態の共有

無関係な React コンポーネント間での状態の共有

WBOY
リリース: 2024-07-17 06:51:30
オリジナル
1153 人が閲覧しました

React コンポーネント間でシリアル化可能なデータを共有する方法を示したいと考えています。 NextJS のクライアント コンポーネント

無関係なコンポーネントがいくつかあります:

Example app UI

初期状態を含むオブジェクトを作成しましょう

export const state: { count: number } = { count: 0 };
ログイン後にコピー

データは Map または WeakMap に保存でき、状態はそれにアクセスするためのキーになります。また、購読者配列も必要になります。

const stateMap = new WeakMap<object, object>();
const subscribers: (() => void)[] = [];
ログイン後にコピー

次に、データ変更をサブスクライブするフックを作成しましょう。

export function useCommonState<T extends object>(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<typeof stateObj>(() => {
    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);

<button
  onClick={() => setState({ count: state.count + 1 })}
  className="p-2 border"
>
  +
</button>
// ...
Component A<div>Count: {state.count}</div>
ログイン後にコピー

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

読み取り用に送信します。

以上が無関係な React コンポーネント間での状態の共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート