O gancho useEffect React executará a função passada em todas as alterações. Isso pode ser otimizado para permitir a chamada somente quando as propriedades desejadas forem alteradas.
E se eu quiser chamar uma função de inicialização componentDidMount
e não chamá-la novamente nas alterações? Digamos que eu queira carregar uma entidade, mas a função de carregamento não precisa de nenhum dado do componente. Como podemos fazer isso usando o useEffect
gancho?
class MyComponent extends React.PureComponent {
componentDidMount() {
loadDataOnlyOnce();
}
render() { ... }
}
Com ganchos, pode ser assim:
function MyComponent() {
useEffect(() => {
loadDataOnlyOnce(); // this will fire on every change :(
}, [...???]);
return (...);
}
javascript
reactjs
react-hooks
Dávid Molnár
fonte
fonte
TL; DR
useEffect(yourCallback, [])
- acionará o retorno de chamada somente após a primeira renderização.Explicação detalhada
useEffect
é executado por padrão após cada renderização do componente (causando um efeito).Ao colocar
useEffect
seu componente, você diz ao React que deseja executar o retorno de chamada como um efeito. O React executará o efeito após a renderização e após executar as atualizações do DOM.Se você passar apenas um retorno de chamada - o retorno será executado após cada renderização.
Se passar um segundo argumento (matriz), o React executará o retorno de chamada após a primeira renderização e toda vez que um dos elementos da matriz for alterado. por exemplo, ao colocar
useEffect(() => console.log('hello'), [someVar, someOtherVar])
- o retorno de chamada será executado após a primeira renderização e após qualquer renderização que uma dassomeVar
ousomeOtherVar
seja alterada.Ao passar o segundo argumento para uma matriz vazia, o React irá comparar após cada renderização da matriz e verá que nada foi alterado, chamando o retorno de chamada somente após a primeira renderização.
fonte
gancho useMountEffect
A execução de uma função apenas uma vez após a montagem do componente é um padrão tão comum que justifica um gancho próprio que oculta os detalhes da implementação.
Use-o em qualquer componente funcional.
Sobre o gancho useMountEffect
Ao usar
useEffect
com um segundo argumento da matriz, o React executará o retorno de chamada após a montagem (renderização inicial) e após a alteração dos valores na matriz. Como passamos uma matriz vazia, ela será executada somente após a montagem.fonte
useMount
quando sua função de efeito precisar de algo de objetos, mas nunca precisar executar novamente, mesmo que esse valor mude semuseEffect(()=>console.log(props.val),[])
aviso de aviso : haverá um aviso de dependência ausente, masuseMount(()=>console.log(props.val))
não causará um aviso, mas "funciona". Não tenho certeza se haverá um problema no modo simultâneo.Passe uma matriz vazia como o segundo argumento para
useEffect
. Isso informa efetivamente o React, citando os documentos :Aqui está um trecho que você pode executar para mostrar que funciona:
fonte
Eu gosto de definir uma
mount
função, ele engana o EsLint da mesma maneirauseMount
e acho mais auto-explicativo.fonte
O truque é que useEffect usa um segundo parâmetro.
O segundo parâmetro é uma matriz de variáveis que o componente verificará para ter certeza de que foi alterado antes da nova renderização. Você pode colocar quaisquer pedaços de adereços e o estado que quiser aqui para verificar.
Ou, não coloque nada:
Isso garantirá que o useEffect seja executado apenas uma vez.
Nota dos documentos:
Se você usar essa otimização, verifique se a matriz inclui todos os valores do escopo do componente (como adereços e estado) que mudam com o tempo e são usados pelo efeito. Caso contrário, seu código fará referência a valores obsoletos de renderizações anteriores.
fonte