"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Partage de l'état entre des composants React non liés

Partage de l'état entre des composants React non liés

Publié le 2024-08-07
Parcourir:862

Vous souhaitez montrer comment vous pouvez partager des données sérialisables entre des composants React, par ex. composants clients dans NextJS.

Nous avons quelques composants non liés :

Example app UI

Créons un objet qui contiendra l'état initial

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

Nous pouvons stocker des données dans une Map ou une WeakMap, l'état sera une clé pour y accéder. Il faudra également un tableau d’abonnés.

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

Écrivons maintenant un hook pour vous abonner aux modifications de données.

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);
    };
  }, []);
}

Ajoutons maintenant la logique liée à l'obtention et à la définition de l'état

  // 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 };

Et maintenant, vous pouvez l'utiliser dans 3 composants comme

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

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


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

Final app

Vous pouvez voir comment cela fonctionne ici https://stackblitz.com/~/github.com/asmyshlyaev177/react-common-state-example
Ou ici https://codesandbox.io/p/github/asmyshlyaev177/react-common-state-example/main
Ou sur github https://github.com/asmyshlyaev177/react-common-state-example

Découvrez ma bibliothèque pour NextJS basée sur ce principe https://github.com/asmyshlyaev177/state-in-url

Tnx pour la lecture.

Déclaration de sortie Cet article est reproduit sur : https://dev.to/asmyshlyaev177/sharing-state-between-unrated-react-components-4aia?1 En cas de violation, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3