"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Compartilhando estado entre componentes React não relacionados

Compartilhando estado entre componentes React não relacionados

Publicado em 2024-08-07
Navegar:927

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:

Example app UI

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();
const subscribers: (() => void)[] = [];

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 A
Count: {state.count}

Final app

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.

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/asmyshlyaev177/sharing-state-between-unrelated-react-components-4aia?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

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