recherche

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

Comment empêcher la réinitialisation de l'état lors de l'appel du setter d'état dans une bibliothèque tierce

J'essaie de convertir un composant de classe React en composant de fonction React.

Il existe une fonction onChange qui peut être appelée à la fois à l'intérieur et à l'extérieur du composant. Le hook useState obtient la valeur initiale lorsque la fonction du composant de fonction est appelée. Lorsque j'utilise l'ancienne méthode de composant de classe, tout fonctionne bien. Pourquoi cela se produit-il et comment y remédier ?

const MyInput = (props) => {
  const { someLib, ...otherProps } = props;
  const [test, setTest] = useState(1); // console show 1,2,3, etc
            
  useEffect(() => {
    someLib && someLib.addCallback(onChange);
  }, []);

  const onChange = (event) => { 
    setTest(test + 1) // this function can called inside MyInput, and from someLib, 
                      // when it called from someLib, 'test' is reset, but in class component everything good 
  }
}

P粉835428659P粉835428659504 Il y a quelques jours668

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

  • P粉514001887

    P粉5140018872023-09-11 22:01:16

    Le problème est que onChange 是一个过时的闭包。您需要做的是使 onChange ressemble à ceci :

    const onChange = (event) => {
        setTest(oldTest => oldTest +1)
    }
    

    Vous pouvez également mettre test 添加到 useEffect dans le tableau des dépendances, mais assurez-vous de le nettoyer. (Tu devrais le faire de toute façon, mais c'est plus important maintenant)

    useEffect(() => {
        someLib && someLib.addCallback(onChange);
    
        return () => {
            someLib.removeCallback(onChange);
        }
    }, [someLib, test]);
    

    Techniquement, si vous utilisez cette dernière méthode, vous devez useCallback

    const onChange = useCallback((event) => {
        setTest(test + 1);
    }, [test]);
    
    useEffect(() => {
        someLib && someLib.addCallback(onChange);
    
        return () => {
            someLib.removeCallback(onChange);
        }
    }, [someLib, onChange]);
    

    L’avantage est que vous n’avez pas besoin de suivre la liste des dépendances de onChange 的依赖项。 onChange à différents endroits maintenant qu’elle est fermée.

    répondre
    0
  • Annulerrépondre