2016-04-20 6 views
1

Ich verwende jetzt , aber ich kann nicht einfach prevProps.myPropObj == this.state.props.myPropObj zu vergleichen. Es ist ein Objekt und ich müsste tief vergleichen. Reagiert mir eine Methode aus, um mir zu sagen, ob sich meine Requisite geändert hat oder nicht? Oder erwarten sie, dass ich selbst den tiefen Vergleich mache? Ich dachte, dass sich react auf diesen Vergleich spezialisiert hat, also sollte es uns sagen, ob es wahr oder falsch ist, ob es gleich ist oder nicht?So vergleichen Sie prevProps mit this.props in sollteComponentUpdate

Antwort

4

Wenn die Stützen unveränderbar sind, können Sie die shallowCompare von react verwenden. Die Requisiten können unveränderlich sein, wenn Sie so etwas wie immutablejs verwenden oder die Objekte ändern, indem Sie ersetzen und sie nicht mutiert, zum Beispiel const prop = Object.assign({}, prop, { changedValues: 'value' });

var shallowCompare = require('react-addons-shallow-compare'); 
export class SampleComponent extends React.Component { 
    shouldComponentUpdate(nextProps, nextState) { 
    return shallowCompare(this, nextProps, nextState); 
    } 

    render() { 
    return <div className={this.props.className}>foo</div>; 
    } 
} 

Für Nicht-es6, nicht-node-Umgebung:

das äquivalent von var shallowCompare = require('react-addons-shallow-compare'); ist var shallowCompare = React.addons.shallowCompare; so vollständiges Beispiel wäre:

aus der Box
var SampleComponent = React.createClass({ 
    shouldComponentUpdate: function(nextProps, nextState) { 
    return React.addons.shallowCompare(this, nextProps, nextState); 
    }, 
    render: function() { 
    return React.createElement('div', {className:this.props.className}, 'foo'); 
    } 
}); 
+0

Bedeutet seicht, dass es nur die Anzahl der eingegebenen Zahlen/Zeichenfolgen/Boolean überprüft? Wenn es ein Objekt sieht, überspringt es es? – Noitidart

+2

Es prüft die unmittelbaren Kinder der Requisiten, wenn sie Objekte oder Arrays sind, vergleicht es nur die Referenzen. Deshalb müssen Sie Ihre Objekt- und Array-Requisiten ersetzen und nicht mutieren. –

+0

Ah perfekt! Ich setze setState nur, indem ich 'var newObj = JSON.parse (JSON.stringify (this.state.obj)); this.setState ({obj: newObj}) ', egal wie tief mein Objekt ist, gilt dies als unveränderlich? – Noitidart

1

Reagieren bietet keinen tiefen Vergleich von Objekten.

Sie könnten etwas selbst dafür bauen. ZB durch Hinzufügen und Verwalten einer eindeutigen ID zu Ihrem Objekt, um Änderungen zu registrieren.

Oder verwenden Sie eine Bibliothek wie immutableJS konsistent über Ihre App. Lohnenswert für große komplexe App mit großen komplexen Objekten.

Um sicher zu gehen: Für die Funktionalität Ihrer App sollten Sie nicht shouldComponentUpdate() benötigen. React hat eine eigene Engine, die nur Unterschiede zwischen Zuständen macht.

+0

Danke für diese Einsicht, es gibt mir Fragen, die mir helfen, React viel mehr zu verstehen. Steht hier nicht der letzte Satz in Konflikt mit dem, was wir in diesem Thema besprochen haben: http://stackoverflow.com/q/36741540/1828637 - auf 'componentDidUpdate' läuft das ständig? Oder wird das DOM niemals wirklich aktualisiert, obwohl das 'componentDidUpdate' triggert – Noitidart

+1

' componentDidUpdate() 'läuft nach Render-Zyklus, auch wenn Render nicht zu DOM-Änderung führte. Wenn in einer Runde prop = A: dann reagiert reagieren Komponente auf DOM. Wenn in der nächsten Runde prop übergeben wird, wird der Wert immer noch A: react wird erneut rendern Zyklus (aber nicht ändern DOM, weil sich nichts geändert), und wird 'componentDidUpdate()' danach ausführen. Wenn Sie 'shouldComponentUpdate()' implementiert haben, wird in der nächsten Runde zuerst 'shouldComponentUpdate()' überprüft, wodurch false zurückgegeben wird. Dann wird der Renderzyklus abgebrochen und 'componentDidUpdate()' wird NICHT ausgeführt. – wintvelt

+0

Whoops Ich war für eine Weile weg, um diese Antwort zu sehen, als Sie sehr! Ich bin also nicht sicher, was Sie mit dem letzten Satz in dieser obigen Lösung meinen.Sie haben erwähnt, dass 'shouldComponentUpdate' nicht benötigt werden sollte. Bedeutet dies, dass 'componentDidUpdate' nicht benötigt wird, und nur wenn ich' componentDidUpdate' verwende, dann muss ich 'shouldComponentUpdate' oder somethign verwenden, um zu überprüfen, ob es sich wirklich geändert hat? Danke, dass deine Patientin erklärt hat. Ich liebe React, ich versuche es nur zu verstehen. – Noitidart

Verwandte Themen