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
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:
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');
}
});
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.
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
' 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
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
- 1. Asynchrone fire ein sollteComponentUpdate?
- 2. Reagieren - erfassen intermediate in sollteComponentUpdate
- 3. So vergleichen Sie SSL-Zertifikate mit AFNetworking
- 4. Verwenden von Reacts sollteComponentUpdate mit Immutable.js Cursors
- 5. So vergleichen Sie "Any" -Werttypen
- 6. So vergleichen Sie Werte in Array
- 7. So vergleichen Sie Daten in XSLT
- 8. Ist es sinnvoll, Arrays von Objekten in react's sollteComponentUpdate zu vergleichen?
- 9. `this.props` in` getDefaultProps() `von React?
- 10. Was bedeutet "... this.props" in ReactJS?
- 11. So vergleichen Sie Datum mit dem aktuellen Datum in PHP
- 12. So vergleichen Sie DateTime im Extbase-Repository
- 13. Was ist this.props (Meteor mit React Tutorial)
- 14. So vergleichen Sie Quellcode über TFS-Projekte
- 15. So wählen Sie AVX vergleichen Prädikat Varianten
- 16. So vergleichen Sie eine Zelle mit DataGridViewCell CellType
- 17. So vergleichen Sie zwei deutlich unterschiedliche Objekte mit ähnlichen Eigenschaften
- 18. So vergleichen Sie eine C# DateTime mit Javascript Date.now()
- 19. So vergleichen Sie die Methode ReturnType mit vordefinierten Typen
- 20. Warum Daten nicht mit this.props in react js gerendert werden?
- 21. So vergleichen Sie 2 verschiedene Spalten in Google Sheet
- 22. JavaScript: var {links, ... requisiten} = this.props;
- 23. Hinzufügen von Requisiten zu ... this.props
- 24. Undefiniert beim Zugriff auf this.props in react Komponente mit Redux
- 25. So vergleichen Sie Zeichen Vektoren für Teiltreffer in R
- 26. So speichern/speichern Sie temporäre Werte und vergleichen Sie?
- 27. Vergleichen Sie Zeichen mit Array
- 28. Vergleichen Sie DataOutputStream mit String in Java
- 29. Vergleichen Sie Daten in VBA mit Offsetbetrag
- 30. Vergleichen Sie Substrig mit Split in Java
Bedeutet seicht, dass es nur die Anzahl der eingegebenen Zahlen/Zeichenfolgen/Boolean überprüft? Wenn es ein Objekt sieht, überspringt es es? – Noitidart
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. –
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