Pourquoi, dans l'exemple de pseudo-code suivant, Child ne s'affiche pas à nouveau lorsque Container change foo.bar?
Container {
handleEvent() {
this.props.foo.bar = 123
},
render() {
return <Child bar={this.props.foo.bar} />
}
Child {
render() {
return <div>{this.props.bar}</div>
}
}
Même si j'appelle forceUpdate()
après avoir modifié la valeur dans Container, Child affiche toujours l'ancienne valeur.
javascript
html
reactjs
Tuomas Toivonen
la source
la source
<Route exact path="/user/:email" component={ListUserMessagePage} />
, un lien sur la même page mettra à jour les accessoires sans créer une nouvelle instance et exécuter les événements habituels de cycle de vie.Réponses:
Mettez à jour l'enfant pour que l'attribut «clé» soit égal au nom. Le composant sera rendu à chaque fois que la clé change.
la source
[props.notRenderingArr, props.dummy]
. Si la longueur du tableau change toujours, vous pouvez définir le tableau de dépendances useEffect sur[props.notRenderingArr.length]
.key
obligatoire, vs justesetState
? J'ai des enfants qui dépendent de l'état de leurs parents, mais ils ne déclenchent pas de rendu ...Parce que les enfants ne sont pas rendus si les accessoires du parent changent, mais si son STATE change :)
Ce que vous montrez est le suivant: https://facebook.github.io/react/tips/communicate-between-components.html
Il transmettra les données du parent à l'enfant via des accessoires, mais il n'y a pas de logique de rendu.
Vous devez définir un état pour le parent, puis rendre l'enfant à l'état de changement de parent. Cela pourrait aider. https://facebook.github.io/react/tips/expose-component-functions.html
la source
J'ai eu le même problème. C'est ma solution, je ne suis pas sûr que ce soit la bonne pratique, dites-moi si non:
UPD: Vous pouvez maintenant faire la même chose en utilisant React Hooks: (uniquement si le composant est une fonction)
la source
componentDidUpdate
dans ce cas va dans le composant Child.FunctionComponents
mettra automatiquement à jour les composants enfants si les accessoires changent.Selon la philosophie de React, le composant ne peut pas changer ses accessoires. ils doivent être reçus du parent et doivent être immuables. Seul le parent peut changer les accessoires de ses enfants.
belle explication sur l' état vs les accessoires
aussi, lisez ce fil Pourquoi ne puis-je pas mettre à jour les accessoires dans react.js?
la source
Vous devez utiliser la
setState
fonction. Sinon, l'état ne sauvegardera pas votre modification, quelle que soit la manière dont vous utilisez forceUpdate.Votre code ne semble pas valide. Je ne peux pas tester ce code.
la source
<Child bar={this.state.foo.bar} />
?Lors de la création de composants React à partir de
functions
etuseState
.Ça ne marche pas
Cela fonctionne (ajout d'une clé)
la source
Confirmé, l'ajout d'une clé fonctionne. J'ai parcouru la documentation pour essayer de comprendre pourquoi.
React veut être efficace lors de la création de composants enfants. Il ne rendra pas un nouveau composant s'il est identique à un autre enfant, ce qui accélère le chargement de la page.
L'ajout d'une clé force React à rendre un nouveau composant, réinitialisant ainsi l'état pour ce nouveau composant.
https://reactjs.org/docs/reconciliation.html#recursing-on-children
la source
Utilisez la fonction setState. Alors tu pourrais faire
à l'intérieur de la méthode d'événement handle.
Une fois que l'état est mis à jour, il déclenchera des modifications et un nouveau rendu aura lieu.
la source
Vous devriez probablement faire de l'enfant un composant fonctionnel s'il ne conserve aucun état et restitue simplement les accessoires, puis l'appelle depuis le parent. Une alternative à cela est que vous pouvez utiliser des hooks avec le composant fonctionnel (useState) qui provoquera le nouveau rendu du composant sans état.
Vous ne devez pas non plus modifier les propas car elles sont immuables. Maintenir l'état du composant.
la source
Je rencontrais le même problème. J'avais un
Tooltip
composant qui recevait unshowTooltip
accessoire, que je mettais à jour sur unParent
composant en fonction d'uneif
condition, il était mis à jour dans leParent
composant mais leTooltip
composant ne rendait pas.L'erreur que je faisais est de déclarer
showTooltip
comme un let.J'ai réalisé ce que je faisais mal, je violais les principes du fonctionnement du rendu, le remplacer par des crochets a fait le travail.
la source
définir les accessoires modifiés dans mapStateToProps de la méthode de connexion dans le composant enfant.
Dans mon cas, le canal de channelList est mis à jour donc j'ai ajouté chanelList dans mapStateToProps
la source
cet exemple utilise
useEffect
pour changer d'état lors d'unprops
changement.la source