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 statepode ser sincronizado com o novo props.
Borda de caso: Uma vez que stateas atualizações, em seguida, o aplicativo faz re-render!
Acontece que se seu aplicativo está usando apenas statepara exibir seus elementos, propspode atualizar, mas statenão fará, portanto, não renderizará novamente.
Eu tinha stateque depender do propsrecebido 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 postIddo url, mas a informação ainda não storefoi 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, propsforam recebidos, mas o aplicativo não foi atualizado. statenão atualizou.
Bem, props será atualizado e propagado, mas statenão. Você precisa informar especificamente statepara atualizar.
Você não pode fazer isso em render() , e componentDidMountjá terminou seus ciclos.
componentWillReceiveProps é onde você atualiza state propriedades que dependem de um propvalor 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á statepara se manter em sincronia com as propsatualizações.
Uma vez que stateas atualizações, então campos dependendo de state fazer re-render!