Warum wird Child im folgenden Pseudocode-Beispiel nicht neu gerendert, wenn der Container foo.bar ändert?
Container {
handleEvent() {
this.props.foo.bar = 123
},
render() {
return <Child bar={this.props.foo.bar} />
}
Child {
render() {
return <div>{this.props.bar}</div>
}
}
Auch wenn ich forceUpdate()
nach dem Ändern des Werts in Container aufrufe, zeigt Child immer noch den alten Wert an.
javascript
html
reactjs
Tuomas Toivonen
quelle
quelle
<Route exact path="/user/:email" component={ListUserMessagePage} />
. Ein Link auf derselben Seite aktualisiert die Requisiten, ohne eine neue Instanz zu erstellen und die üblichen Lebenszyklusereignisse auszuführen.Antworten:
Aktualisieren Sie das untergeordnete Element so, dass das Attribut 'Schlüssel' dem Namen entspricht. Die Komponente wird jedes Mal neu gerendert, wenn sich der Schlüssel ändert.
quelle
[props.notRenderingArr, props.dummy]
. Wenn sich die Länge des Arrays immer ändert, können Sie das Abhängigkeitsarray useEffect auf setzen[props.notRenderingArr.length]
.key
erforderlich, gegen nursetState
? Ich habe einige Kinder, die sich auf den Zustand der Eltern verlassen, aber sie lösen kein erneutes Rendern aus ...Weil Kinder nicht erneut rendern, wenn sich die Requisiten des Elternteils ändern, sondern wenn sich der STAAT ändert :)
Was Sie zeigen, ist Folgendes: https://facebook.github.io/react/tips/communicate-between-components.html
Es werden Daten von Eltern zu Kindern über Requisiten weitergegeben, aber es gibt dort keine Renderlogik.
Sie müssen einen Status für das übergeordnete Element festlegen und dann das untergeordnete Element beim Ändern des übergeordneten Status erneut rendern. Das könnte helfen. https://facebook.github.io/react/tips/expose-component-functions.html
quelle
Ich hatte das gleiche Problem. Dies ist meine Lösung. Ich bin mir nicht sicher, ob dies die gute Praxis ist. Sagen Sie mir, wenn nicht:
UPD: Jetzt können Sie dasselbe mit React Hooks tun: (nur wenn die Komponente eine Funktion ist)
quelle
componentDidUpdate
in diesem Fall in die Child-Komponente.FunctionComponents
werden untergeordnete Komponenten automatisch aktualisiert, wenn sich die Requisiten ändern.Laut React-Philosophie kann die Komponente ihre Requisiten nicht ändern. Sie sollten vom Elternteil erhalten und unveränderlich sein. Nur Eltern können die Requisiten ihrer Kinder ändern.
nette Erklärung zu Zustand gegen Requisiten
Lesen Sie auch diesen Thread. Warum kann ich Requisiten in react.js nicht aktualisieren?
quelle
Sie sollten die
setState
Funktion verwenden. Wenn nicht, speichert state Ihre Änderung nicht, unabhängig davon, wie Sie forceUpdate verwenden.Ihr Code scheint ungültig zu sein. Ich kann diesen Code nicht testen.
quelle
<Child bar={this.state.foo.bar} />
?Beim Erstellen Reagieren Sie Komponenten aus
functions
unduseState
.Dies gilt nicht Arbeit
Dies funktioniert (Hinzufügen eines Schlüssels)
quelle
Bestätigt, das Hinzufügen eines Schlüssels funktioniert. Ich ging die Dokumente durch, um zu verstehen, warum.
React möchte beim Erstellen untergeordneter Komponenten effizient sein. Eine neue Komponente wird nicht gerendert, wenn sie mit einem anderen untergeordneten Element identisch ist, wodurch die Seite schneller geladen wird.
Durch Hinzufügen eines Schlüssels wird die Reaktion zum Rendern einer neuen Komponente erzwungen, wodurch der Status für diese neue Komponente zurückgesetzt wird.
https://reactjs.org/docs/reconciliation.html#recursing-on-children
quelle
Verwenden Sie die Funktion setState. Also könntest du es tun
innerhalb der Handle-Event-Methode.
Sobald der Status aktualisiert wurde, werden Änderungen ausgelöst und erneut gerendert.
quelle
Sie sollten das untergeordnete Element wahrscheinlich als Funktionskomponente festlegen, wenn es keinen Status beibehält und die Requisiten einfach rendert und dann vom übergeordneten Element aus aufruft. Alternativ dazu können Sie Hooks mit der Funktionskomponente (useState) verwenden, wodurch die zustandslose Komponente erneut gerendert wird.
Sie sollten die Propas auch nicht ändern, da sie unveränderlich sind. Behalten Sie den Status der Komponente bei.
quelle
Ich hatte das gleiche Problem. Ich hatte eine
Tooltip
Komponente, die eineshowTooltip
Requisite erhielt, die ichParent
basierend auf einerif
Bedingung für eineParent
Komponente aktualisierte. Sie wurde in der Komponente aktualisiert, aber dieTooltip
Komponente wurde nicht gerendert.Der Fehler, den ich gemacht habe, ist,
showTooltip
als vermietet zu deklarieren .Mir wurde klar, was ich falsch gemacht habe. Ich habe gegen die Prinzipien des Renderns verstoßen. Das Ersetzen durch Hooks hat den Job gemacht.
quelle
Definieren Sie geänderte Requisiten in mapStateToProps der Verbindungsmethode in der untergeordneten Komponente.
In meinem Fall wird der Kanal von channelList aktualisiert, sodass ich chanelList in mapStateToProps hinzugefügt habe
quelle