O título diz tudo. Eu entendo por que componentDidMounté apropriado para qualquer coisa que requer acesso DOM, mas uma solicitação AJAX não necessariamente ou geralmente precisa disso.
O que da?
O título diz tudo. Eu entendo por que componentDidMounté apropriado para qualquer coisa que requer acesso DOM, mas uma solicitação AJAX não necessariamente ou geralmente precisa disso.
O que da?
Respostas:
componentDidMounté para efeitos colaterais. Adicionar ouvintes de eventos, AJAX, alterar o DOM, etc.
componentWillMountraramente é útil; especialmente se você se preocupa com a renderização do lado do servidor (adicionar ouvintes de evento causa erros e vazamentos, e muitas outras coisas que podem dar errado).
Fala-se sobre a remoção componentWillMountde componentes de classe, uma vez que serve ao mesmo propósito que o construtor. Ele permanecerá nos createClasscomponentes.
componentWillMount? Eu realmente não vejo a diferença.
componentWillMountserá executado em uma renderização do lado do servidor. Se você estivesse usando componentDidMount, isso só seria executado no lado do cliente. Como resultado, colocar coisas componentWillMountque executam interações externas ou vinculam-se a eventos, etc., não é uma boa ideia. Se você não tem planos de renderizar seus componentes no lado do servidor, ainda não é uma boa ideia apenas pela potencial portabilidade do código. Isso tudo está fora do motivo principal de ser ruim, o que é explicado na resposta de @daniula.
Tive o mesmo problema no início também. Eu decidi tentar fazer pedidos, componentWillMountmas acabou em vários pequenos problemas.
Eu estava disparando a renderização quando a chamada ajax termina com novos dados. Em algum ponto, a renderização do componente demorou mais do que a obtenção da resposta do servidor e, nesse ponto, o retorno de chamada ajax estava disparando a renderização no componente não montado. Este é um tipo de caso extremo, mas provavelmente há mais, por isso é mais seguro seguir componentDidMount.
componentWillMount, então você ainda deve continuar usando componentDidMountpara suas chamadas ajax.
setStateum construtor de componente e não tem como determinar quando a chamada AJAX será concluída. twitter.com/dan_abramov/status/576453138598723585
De acordo com a documentação, definir o estado em componentWillMountnão acionará uma nova renderização. Se a chamada AJAX não estiver bloqueando e você retornar um Promiseque atualiza o estado do componente em caso de sucesso, há chances de que a resposta chegue depois que o componente for renderizado. Como componentWillMountnão dispara uma re-renderização, você não terá o comportamento esperado, que é o componente sendo renderizado com os dados solicitados.
Se você usar qualquer uma das bibliotecas de fluxo e os dados solicitados acabarem no armazenamento ao qual o componente está conectado (ou herdar de um componente conectado), isso não será um problema, pois a recepção desses dados, provavelmente, mudará os props eventualmente.
componentWillMountnão dispara uma nova renderização apenas porque um novo estado é definido antes da primeira renderização. Mas se setStatefor chamado em um retorno de chamada AJAX, ele será definitivamente chamado após a primeira renderização e acionará uma nova renderização.
componentWillMountnele falhará, visto que o componente ... não montou.