"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Compartir estado entre componentes de React no relacionados

Compartir estado entre componentes de React no relacionados

Publicado el 2024-08-07
Navegar:860

Quiere mostrar cómo puede compartir datos serializables entre componentes de React, p. componentes del cliente en NextJS.

Tenemos pocos componentes no relacionados:

Example app UI

Creemos un objeto que contendrá el estado inicial

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

Podemos almacenar datos en un Mapa o en un Mapa Débil, el estado será la clave para acceder a ellos. Además, necesitará una matriz de suscriptores.

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

Ahora escribamos un enlace para suscribirse a los cambios de datos.

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

Ahora agreguemos lógica relacionada con obtener y establecer el estado

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

Y ahora puedo usarlo en 3 componentes como

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

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


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

Final app

Puedes ver cómo funciona aquí https://stackblitz.com/~/github.com/asmyshlyaev177/react-common-state-example
O aquí https://codesandbox.io/p/github/asmyshlyaev177/react-common-state-example/main
O en github https://github.com/asmyshlyaev177/react-common-state-example

Consulte mi biblioteca para NextJS según este principio https://github.com/asmyshlyaev177/state-in-url

Gracias por leer.

Declaración de liberación Este artículo se reproduce en: https://dev.to/asmyshlyaev177/sharing-state-between-un related-react-components-4aia?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3