Quiere mostrar cómo puede compartir datos serializables entre componentes de React, p. componentes del cliente en NextJS.
Tenemos pocos componentes no relacionados:
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
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 ACount: {state.count}
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.
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