Você não pode usar qualquer um dos métodos de ciclo de vida existentes ( componentDidMount
, componentDidUpdate
, componentWillUnmount
etc.) em um gancho. Eles só podem ser usados em componentes de classe. E com ganchos você pode usar apenas em componentes funcionais. A linha abaixo vem do documento React:
Se você estiver familiarizado com Reagir métodos de ciclo de vida de classe, você pode pensar em useEffect
gancho como componentDidMount
, componentDidUpdate
e componentWillUnmount
combinado.
A sugestão é que você possa imitar esse método do ciclo de vida do componente de classe em um componente funcional.
O código interno é componentDidMount
executado uma vez quando o componente está montado. useEffect
gancho equivalente para esse comportamento é
useEffect(() => {
// Your code here
}, []);
Observe o segundo parâmetro aqui (matriz vazia). Isso será executado apenas uma vez.
Sem o segundo parâmetro, o useEffect
gancho será chamado em todas as renderizações do componente que possam ser perigosas.
useEffect(() => {
// Your code here
});
componentWillUnmount
é usado para limpeza (como remover ouvintes de eventos, cancelar o cronômetro etc.). Digamos que você esteja adicionando um ouvinte de evento componentDidMount
e removendo-o componentWillUnmount
como abaixo.
componentDidMount() {
window.addEventListener('mousemove', () => {})
}
componentWillUnmount() {
window.removeEventListener('mousemove', () => {})
}
O equivalente do código acima do gancho será o seguinte
useEffect(() => {
window.addEventListener('mousemove', () => {});
// returned function will be called on component unmount
return () => {
window.removeEventListener('mousemove', () => {})
}
}, [])
useEffect()
função, obrigado.componentWillMount
componentWillMount
, nãocomponentWillUnmount
. Essa resposta realmente não responde à pergunta e apenas reitera o que o OP já implicava em saber.gancho useComponentDidMount
Na maioria dos casos,
useComponentDidMount
é a ferramenta a ser usada. Ele será executado apenas uma vez, após a montagem do componente (renderização inicial).useComponentWillMount
É importante observar que nos componentes da classe
componentWillMount
é considerado legado. Se você precisar que o código seja executado apenas uma vez antes da montagem do componente, você poderá usar o construtor. Mais sobre isso aqui . Como o componente funcional não tem o equivalente de um construtor, usar um gancho para executar o código apenas uma vez antes da montagem do componente pode fazer sentido em certos casos. Você pode conseguir isso com um gancho personalizado.No entanto, existe uma armadilha. Não use-o para definir seu estado de forma assíncrona (ex., Após uma solicitação do servidor. Como você pode esperar, isso afeta a renderização inicial, o que não ocorrerá). Tais casos devem ser tratados com
useComponentDidMount
.Demo
Demonstração completa
fonte
componentWillMount
based onuseEffect
tem dois problemas. A primeira é que não há um ciclo de vida de montagem nos componentes funcionais, os dois ganchos serão executados após a renderização do componente, o queRuns only once before component mounts
é enganoso. O segundo é quecomponentWillMount
é chamado na renderização do servidor euseEffect
não é. Muitas bibliotecas ainda dependem,UNSAFE_componentWillMount
porque atualmente é a única maneira de acionar um efeito colateral no servidor.De acordo com reactjs.org, componentWillMount não será suportado no futuro. https://reactjs.org/docs/react-component.html#unsafe_componentwillmount
Não há necessidade de usar componentWillMount.
Se você quiser fazer algo antes da montagem do componente, faça-o no construtor ().
Se você deseja fazer solicitações de rede, não faça em componentWillMount. É porque isso levará a erros inesperados.
Solicitações de rede podem ser feitas em componentDidMount.
Espero que ajude.
atualizado em 03/03/2019
O motivo pelo qual você solicita componentWillMount é provavelmente porque deseja inicializar o estado antes da renderização.
Basta fazê-lo em useState.
ou talvez Você queira executar uma função no componentWillMount, por exemplo, se o seu código original estiver assim:
com hook, tudo que você precisa fazer é remover o método do ciclo de vida:
Eu só quero adicionar algo à primeira resposta sobre useEffect.
useEffect é executado em cada renderização, é uma combinação de componentDidUpdate, componentDidMount e ComponentWillUnmount.
Se adicionarmos uma matriz vazia em useEffect, ela será executada exatamente quando o componente estiver montado. É porque useEffect irá comparar a matriz que você passou para ela. Portanto, ele não precisa ser um array vazio. Pode ser um array que não está sendo alterado. Por exemplo, pode ser [1,2,3] ou ['1,2']. useEffect ainda é executado somente quando o componente é montado.
Depende de você se você deseja executar apenas uma vez ou após cada renderização. Não é perigoso se você esqueceu de adicionar uma matriz, desde que saiba o que está fazendo.
Eu criei uma amostra para gancho. Por favor, confira.
https://codesandbox.io/s/kw6xj153wr
atualizado em 21/08/2019
Está branco desde que escrevi a resposta acima. Acho que há algo que você precisa prestar atenção. Quando você usa
Quando reagir compara os valores que você passou para a matriz [], ela usa Object.is () para comparar. Se você passar um objeto para ele, como
É exatamente o mesmo que:
Ele será renderizado novamente sempre que, quando Object.is () compara um objeto, compara sua referência e não o valor em si. É o mesmo porque {} === {} retorna false porque suas referências são diferentes. Se você ainda deseja comparar o objeto em si, não a referência, pode fazer algo assim:
fonte
useLayoutEffect
poderia fazer isso com um conjunto vazio de observadores ([]
) se a funcionalidade for realmente semelhante acomponentWillMount
- ela será executada antes que o primeiro conteúdo chegue ao DOM - embora existam duas atualizações, mas elas sejam síncronas antes de serem exibidas na tela.por exemplo:
O benefício finalizado
useState
com um inicializador / setter ou,useEffect
embora possa computar um passe de renderização, não há renderizações reais no DOM que um usuário notará e é executado antes da primeira renderização perceptível, o que não é o caso deuseEffect
. A desvantagem é, obviamente, um pequeno atraso na sua primeira renderização, uma vez que uma verificação / atualização deve ocorrer antes da pintura na tela. Realmente depende do seu caso de uso.Eu acho que pessoalmente,
useMemo
é bom em alguns casos de nicho em que você precisa fazer algo pesado - desde que você tenha em mente que é a exceção versus a norma.fonte
Esta é a maneira como eu simulo o construtor em componentes funcionais usando o
useRef
gancho:Aqui está o exemplo do ciclo de vida:
É claro que os componentes da classe não possuem
Body
etapas, não é possível fazer uma simulação 1: 1 devido a diferentes conceitos de funções e classes.fonte
Eu escrevi um gancho personalizado que executará uma função uma vez antes da primeira renderização.
useBeforeFirstRender.js
Uso:
fonte
Há uma boa solução alternativa para implementar
componentDidMount
ecomponentWillUnmount
comuseEffect
.Com base na documentação,
useEffect
pode retornar uma função "limpeza". essa função não será chamada na primeirauseEffect
chamada, apenas nas chamadas subseqüentes.Portanto, se usarmos o
useEffect
gancho sem nenhuma dependência, o gancho será chamado apenas quando o componente estiver montado e a função "limpeza" será chamada quando o componente estiver desmontado.A chamada da função de retorno de limpeza é chamada apenas quando o componente é desmontado.
Espero que isto ajude.
fonte
useEffect
chamada que você obter a mesma funcionalidade decomponentWillMount
ecomponentWillUnmount
em uma agradável e limpo maneirauseEffect
apenas é executado após uma renderização enquantocomponentWillMount
é executado antes da renderização do componente.componentDidMount
nãocomponentWillMount
. Eu perdi isso na pergunta, meu mal.Você pode hackear o gancho useMemo para imitar um evento do ciclo de vida componentWillMount. Apenas faça:
Você precisaria manter o gancho useMemo antes de qualquer coisa que interaja com seu estado. Não é assim que se destina, mas funcionou para mim em todos os problemas do componentWillMount.
Isso funciona porque o useMemo não precisa realmente retornar um valor e você não precisa usá-lo como nada, mas como ele memoriza um valor com base nas dependências que serão executadas apenas uma vez ("[]") e estão no topo de nosso componente, é executado uma vez quando o componente é montado antes de qualquer outra coisa.
fonte
https://reactjs.org/docs/hooks-reference.html#usememo
fonte
A resposta de Ben Carp parece ser apenas uma válida para mim.
Porém, como estamos usando maneiras funcionais, apenas outra abordagem pode se beneficiar do fechamento e do HoC:
Então use-o:
fonte
Resposta curta à sua pergunta original , como
componentWillMount
pode ser usada com os ganchos de reação:componentWillMount
foi descontinuado e considerado legado . Reagir recomendação :Agora, nas Perguntas frequentes sobre o Hook, você descobre qual é o equivalente a um construtor de classe para componentes de função:
Portanto, um exemplo de uso se
componentWillMount
parece com isso:fonte
Simplesmente adicione um array de dependência vazio em useEffect, ele funcionará como
componentDidMount
.fonte
Há um truque simples para simular o
componentDidMount
ecomponentWillUnmount
usandouseEffect
:fonte