Ma réponse est un peu à côté de la plaque. Elle fait la lumière sur un problème qui m'a conduit à ce billet. Dans mon cas, il semble que l'application ne soit pas rendue à nouveau, même si elle reçoit de nouveaux accessoires.
Les développeurs de React ont répondu à cette question souvent posée en disant que si le (store) a été muté, dans 99% des cas, c'est la raison pour laquelle react n'effectuera pas un nouveau rendu. Mais rien sur le 1% restant. La mutation n'était pas le cas ici.
TLDR ;
componentWillReceiveProps
est comment le state
peut rester synchronisé avec le nouveau props
.
Cas limite : Une fois state
des mises à jour, puis l'application fait re-rendu !
Il s'avère que si votre application utilise seulement state
pour afficher ses éléments, props
peut être mis à jour, mais state
ne le fera pas, donc pas de nouveau rendu.
J'avais state
qui dépendait de props
reçu de redux store
. Les données dont j'avais besoin n'étaient pas encore dans le magasin, alors je les ai récupérées à partir de l'application componentDidMount
comme il se doit. J'ai récupéré les props, quand mon reducer a mis à jour le store, parce que mon composant est connecté via mapStateToProps. Mais la page n'a pas été rendue, et l'état était toujours plein de chaînes vides.
Prenons l'exemple d'un utilisateur qui charge une page "modifier un article" à partir d'une url enregistrée. Vous avez accès à la page postId
à partir de l'url, mais l'information n'est pas en store
encore, donc tu vas le chercher. Les éléments de votre page sont des composants contrôlés. Ainsi, toutes les données que vous affichez se trouvent dans le fichier state
.
En utilisant redux, les données ont été récupérées, le magasin a été mis à jour, et le composant est connect
mais l'application n'a pas reflété les changements. En regardant de plus près, props
ont été reçues, mais l'application n'a pas été mise à jour. state
n'a pas été mis à jour.
Bien, props
sera mis à jour et se propagera, mais state
ne le fera pas. Vous devez dire spécifiquement state
à mettre à jour.
Vous ne pouvez pas faire cela dans render()
y componentDidMount
a déjà terminé ses cycles.
componentWillReceiveProps
est l'endroit où vous mettez à jour state
qui dépendent d'une modification prop
valeur.
Exemple d'utilisation :
componentWillReceiveProps(nextProps){
if (this.props.post.category !== nextProps.post.category){
this.setState({
title: nextProps.post.title,
body: nextProps.post.body,
category: nextProps.post.category,
})
}
}
Je dois rendre hommage à cet article qui m'a éclairé sur la solution que des dizaines d'autres articles, blogs et repos ont omis de mentionner. Si quelqu'un d'autre a eu du mal à trouver une réponse à ce problème manifestement obscur, la voici :
Méthodes de cycle de vie des composants ReactJs - une plongée en profondeur
componentWillReceiveProps
est l'endroit où vous allez mettre à jour state
pour rester en phase avec props
des mises à jour.
Une fois state
des mises à jour, puis en fonction de state
faire re-rendu !