Problema: Ao usar React hooks e event listeners, o log do console de estado exibe informações incorretas.
Considere o CodeSandbox fornecido: https://codesandbox.io/s/lrxw1wr97m. Quando você clica duas vezes no botão "Adicionar cartão" e, em seguida, clica em "Botão1" no primeiro cartão, o console exibe corretamente o estado com dois cartões. No entanto, se você clicar em "Button2" no mesmo cartão (que é tratado por um ouvinte de evento), o console exibirá incorretamente apenas um cartão no estado.
O O problema surge do tratamento diferente dos manipuladores de eventos nos componentes CardsProvider e Card. Os manipuladores de eventos definidos no componente funcional CardsProvider, handleCardClick e handleButtonClick, são redefinidos cada vez que o componente é renderizado. Isso significa que eles se referem ao estado no momento em que são definidos, que pode ficar obsoleto quando o ouvinte de eventos é acionado.
Por outro lado, o componente Card usa useRef para registrar o ouvinte de eventos, que persiste durante todo o ciclo de vida do componente. Como resultado, a função de ouvinte de evento refere-se ao estado no momento em que o componente foi montado, que está obsoleto.
Uma solução é usar um atualizador de estado função que recebe o estado novo como um argumento, em vez de depender do estado obsoleto do escopo envolvente:
const eventListener = () => {
// Function receives fresh state
setState(freshState => freshState 1);
};
// Event listener is registered using `useEffect` to ensure it is only registered once
useEffect(() => {
// Register event listener
// ...
// Unregister event listener on component unmount
return () => {
// ...
};
}, []);
Nesse cenário, o ouvinte de evento recebe o estado novo, eliminando o problema com dados obsoletos. No entanto, é importante observar que a função atualizadora de estado pode retornar o mesmo estado para evitar atualizações desnecessárias. Use console.log na função de atualizador de estado para observar as mudanças de estado.
Formas alternativas de resolver esse problema incluem:
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