In Reaktion, die Art, wie es herausfindet, ob es re-render-dom ist, ist durch das Testen von Referenzen von Objekten/Funktionen.Container-Komponenten sind schlecht? Soll stattdessen store.getState und store.dispatch direkt verwendet werden?
Also bei jedem Update wird der gesamte JS berechnet. Bedeutung Containerelemente zurückgeben zwei neue Objekte jedes Mal, einen für maptDispatchToProps
und einen für mapStateToProps
:
const mapStateToProps = (state, ownProps) => {
return {
active: ownProps.filter === state.visibilityFilter
}
}
const mapDispatchToProps = (dispatch, ownProps) => {
return {
onClick:() => {
dispatch(setVisibilityFilter(ownProps.filter))
}
}
}
In obigem Code, den wir jedes Mal enthält active
Schlüssel und dann ein neues Objekt enthält eine neue Funktion ein neues Objekt sehen zu onClick
. Die Verweise auf diese 3 sind in jedem js-Zyklus brandneu. React vergleicht diese Referenzen und berechnet dann die js in der Komponente neu. Aber ich dachte mit Redux, dass shouldComponentUpdate
nicht getestet werden musste, wie kann das sein, wenn sich alle diese 3 Referenzen geändert haben? Especiall die onClick
, die dazu führen wird, reagieren auf dann fügen Sie die onClick
wieder mit addEventListener
.
Dankeszeichen, was ist mit der Funktion 'onClick' von' mapDipsatchToProps' zurückgegeben, eine Gleichheitsüberprüfung würde sicherlich anders nein zurückkehren? Ich war verwirrt, weil von den Reduzierern, wenn sich nichts änderte, ich 'unbestimmt' zurücksand, aber ich bekam einen Fehler in der Konsole, der mir sagte, dies nicht zu tun, und stattdessen den ursprünglichen 'state'-Parameter zurückzugeben, der dieselbe Referenz bedeuten würde. – Noitidart
Die Funktion 'connect()' überprüft die Deklaration von 'mapDispatchToProps', um festzustellen, ob ein oder zwei Argumente benötigt werden. Wenn es nur einen Arg benötigt, dann ist Ihr 'mapDispatch' nicht auf Requisiten angewiesen, die an die Komponente übergeben werden, so dass es nur einmal ausgeführt wird. Wenn Ihr 'mapDispatch' zwei Argumente annimmt, hängt dies von eingehenden Requisiten ab. Daher wird es erneut ausgeführt, wenn die übergeordnete Komponente erneut gerendert wird. In diesem Fall hätten Sie wahrscheinlich eine neue Gruppe von Funktionen erstellt, die dazu führen würden, dass die reale Komponente erneut gerendert wird. Sie können Ihr 'mapDispatch' und die Komponente restrukturieren, um dies zu vermeiden. – markerikson
Danke @mark Ich muss darüber mehr nachdenken. Vielen Dank. – Noitidart