Minha resposta está um pouco fora do campo esquerdo. Ele lança luz sobre um problema que me levou a este post. No meu caso, parecia que o aplicativo não estava sendo renderizado novamente, embora recebesse novos adereços.
Os desenvolvedores do React tiveram uma resposta para essa pergunta frequente, algo que diz que se o (armazenamento) sofreu uma mutação, 99% das vezes esse é o motivo pelo qual o react não renderá novamente. Ainda nada sobre os outros 1%. Mutação não era o caso aqui.
TLDR;
componentWillReceiveProps
é como o state
pode ser sincronizado com o novo props
.
Borda de caso: Uma vez que state
as atualizações, em seguida, o aplicativo faz re-render!
Acontece que se seu aplicativo está usando apenas state
para exibir seus elementos, props
pode atualizar, mas state
não fará, portanto, não renderizará novamente.
Eu tinha state
que depender do props
recebido do redux store
. Os dados de que eu precisava ainda não estavam na loja, então eu os busquei componentDidMount
, como é apropriado. Eu recebi os adereços de volta, quando meu redutor atualizou a loja, porque meu componente está conectado via mapStateToProps. Mas a página não foi renderizada e o estado ainda estava cheio de strings vazias.
Um exemplo disso é dizer que um usuário carregou uma página de "edição de postagem" de um url salvo. Você tem acesso a postId
do url, mas a informação ainda não store
foi encontrada, então você a busca. Os itens em sua página são componentes controlados - portanto, todos os dados que você está exibindo estão em state
.
Usando redux, os dados foram buscados, o armazenamento foi atualizado e o componente é connect
editado, mas o aplicativo não refletiu as alterações. Olhando mais de perto, props
foram recebidos, mas o aplicativo não foi atualizado. state
não atualizou.
Bem, props
será atualizado e propagado, mas state
não. Você precisa informar especificamente state
para atualizar.
Você não pode fazer isso em render()
, e componentDidMount
já terminou seus ciclos.
componentWillReceiveProps
é onde você atualiza state
propriedades que dependem de um prop
valor alterado .
Exemplo de uso:
componentWillReceiveProps(nextProps){
if (this.props.post.category !== nextProps.post.category){
this.setState({
title: nextProps.post.title,
body: nextProps.post.body,
category: nextProps.post.category,
})
}
}
Devo agradecer a este artigo que me iluminou sobre a solução que dezenas de outros posts, blogs e repositórios deixaram de mencionar. Qualquer outra pessoa que teve problemas para encontrar uma resposta para este problema evidentemente obscuro, aqui está:
Métodos de ciclo de vida do componente ReactJs - um mergulho profundo
componentWillReceiveProps
é onde você atualizará state
para se manter em sincronia com as props
atualizações.
Uma vez que state
as atualizações, então campos dependendo de state
fazer re-render!