2016-05-29 3 views
1

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.

Antwort

2

Sie missverstehen, wie "flache Gleichheit" funktioniert. Beide React PureRenderMixin und React Redux connect Funktion verwenden "flache Gleichheit", um festzustellen, ob sich etwas tatsächlich geändert hat. Das bedeutet, dass die obersten Werte von zwei Objekten verglichen werden, um festzustellen, ob jedes Wertepaar gleich === ist, anstatt zu vergleichen, ob die Objekte selbst die gleichen sind. Also, wenn ich:

var a = {q : 42}; 
var b = {a : a}; 
var c = {a : a}; 

Dann B und C sind deutlich unterschiedliche Objekte, sondern flach gleich, weil für sie beide, das „a“ Feldpunkte auf das gleiche Objekt.

Im Fall der React Redux connect() Funktion überprüft es außerdem in erster Linie den Rückgabewert mapStateToProps, um festzustellen, ob die umschlossene Komponente aktualisiert werden muss.

+0

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

+1

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

+0

Danke @mark Ich muss darüber mehr nachdenken. Vielen Dank. – Noitidart

Verwandte Themen