recherche

Maison  >  Questions et réponses  >  le corps du texte

Exposer la fonction setter useState à la portée globale dans React

Je suis curieux de savoir si je peux faire quelque chose comme ceci :

const [panelActive, setPanelActive] = useState(false);
(globalThis as any).setPanelActive = setPanelActive;

useEffect(() => console.log(panelActive), [panelActive])

Pour une raison quelconque, lorsque je l'appelle de l'extérieur, setPanelActive 函数时,useEffect ne se déclenche pas.

Dois-je créer une sorte de wrapper ou de contexte ? Fournisseur pour que ça marche ?

P粉299174094P粉299174094535 Il y a quelques jours905

répondre à tous(2)je répondrai

  • P粉587970021

    P粉5879700212023-09-12 09:11:45

    Si vous vous attendez à ce que globalThis.setPanelActive 与您正在执行的分配中的 setPanelActive fonctionne de la même manière, vous vous trompez, les hooks sont conçus pour fonctionner dans le cadre du composant, auquel cas vous devez utiliser context à un niveau supérieur comme ceci :

    const App = () => {
      export const PanelConext = createContext(); // import createContext
      const [panelActive, setPanelActive] = useState(false);
      //...
    
      useEffect(() => console.log(panelActive), [panelActive])
    
      
      return (
        <PanelConext.Provider value={{ panelActive, setPanelActive}}>
          //..
        </PanelConext.Provider>
      );
    };
    
    const Component = () => {
      const { panelActive, setPanelActive} = useContext(PanelContext); // import `PanelContext`from App and `useContext` from react
      //...
    };
    

    Maintenant, lorsque vous utilisez setPanelActive 时,useEffect à partir de n'importe quel composant, cela devrait déclencher

    répondre
    0
  • P粉333186285

    P粉3331862852023-09-12 00:33:05

    Merci à tous pour votre participation. Après avoir fait quelques recherches sur ce que @hatana a mentionné, j'ai trouvé une solution - @hatana . com/DawChihLiou/eventbus-demo" rel="nofollow noreferrer">Event Bus . Il fait exactement ce que je voulais.

    répondre
    0
  • Annulerrépondre