Deseja mostrar como você pode compartilhar quaisquer dados serializáveis entre componentes React, por exemplo. componentes do cliente em NextJS.
Temos alguns componentes não relacionados:
Vamos criar um objeto que conterá o estado inicial
export const state: { count: number } = { count: 0 };
Podemos armazenar dados em um Mapa ou WeakMap, o estado será a chave para acessá-los. Além disso, será necessário um array de assinantes.
const stateMap = new WeakMap
Agora vamos escrever um gancho para assinar alterações de dados.
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); }; }, []); }
Agora vamos adicionar lógica relacionada ao estado get e set
// 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 };
E agora pode usá-lo em 3 componentes como
import { state as myState } from './state'; //... const { state, setState } = useCommonState(myState); // ... Component ACount: {state.count}
Você pode ver como funciona aqui https://stackblitz.com/~/github.com/asmyshlyaev177/react-common-state-example
Ou aqui https://codesandbox.io/p/github/asmyshlyaev177/react-common-state-example/main
Ou no github https://github.com/asmyshlyaev177/react-common-state-example
Confira minha biblioteca para NextJS com base neste princípio https://github.com/asmyshlyaev177/state-in-url
Tnx para leitura.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3