Ich verstehe, dass dies in der guide gegen gewarnt wird, aber ich bin mir nicht sicher, ob ich das Problem mit dem Aufruf setState
von innerhalb componentWillUpdate
sehen kann. Richtig, es kann zu einer unendlichen Rekursion führen, es sei denn, liefert natürlich einen Grund für diese Rekursion (eine Möglichkeit, daraus auszubrechen). Z.B. Eine Möglichkeit könnte darin bestehen, den zweiten Parameter (nextState
) in componentWillUpdate
zu überprüfen und setState
nicht erneut aufzurufen, wenn eine Bedingung erfüllt ist (dh wenn die Rekursion beendet ist).
Als ein minimales Beispiel stellen Sie sich eine Komponente vor, die überhaupt keine Eigenschaften hat, sondern nur zwei Zustandszustände. Stellen Sie sich weiter vor, dass das zweite Stück des Staates asynchron von dem ersten erhalten wird. Z.B. Der erste Teil des Zustands könnte ein Parameter sein, der einem Ajax-Aufruf zur Verfügung gestellt wird, und der zweite Teil des Zustands ist das Ergebnis dieses Aufrufs. Also im Grunde rufen Sie this.setState
, um die Parameter zu konfigurieren und dann in componentWillUpdate
können Sie so etwas wie die folgenden (Dinge einfach zu halten verwende ich ein window.setTimeout
als Platzhalter für einen Ajax-Aufruf) tun:
const ComponentWithAsyncState = React.createClass({
getInitialState: function() {
return {
ajaxParams: '',
ajaxResult: ''
};
},
setAjaxParams: function(params) {
this.setState({ajaxParams: params});
},
componentWillUpdate: function(_, nextState) {
if (nextState.ajaxParams!=this.state.ajaxParams)
window.setTimeout(function imagineThisIsAjax() {
this.setState({ajaxResult: `result from ${nextState.ajaxParams}`});
}.bind(this), 2000);
},
Wenn (zB durch einige Steuerelemente von dieser Komponente) der ajaxParams
Änderung, die Abfolge von Aktionen verwaltet werden so etwas wie (wo ~~>
bezeichnet Asynchronität) sein:
setAjaxParams --> this.setState --> componentWillUpdate ~~> imagineThisIsAjax --> this.setState --> componentWillUpdate
Ie der zweite Aufruf an componentWillUpdate
wird nicht zu einem weiteren this.setState
führen und somit wird die Rekursion dort enden.
Danke! Ich habe die Dokumente gelesen, aber die Idee von Requisiten und Zuständen, die componentWillUpdate auslösen, nicht verstanden. Eigentlich wollte ich componentWillUpdate aufrufen, weil ich neue Requisiten von einem Elternteil erhalte. Ich möchte jedoch die Daten in den Requisiten verarbeiten, bevor ich meine Daten rendern lasse. Bedeutet das, dass ich setState nicht aufrufen muss und die Requisiten nur direkt manipulieren muss? – hdavidzhu
@David, ändern Sie Kinder Requisiten nach der Montage sie auf die Dom? Du solltest Requisiten niemals direkt manipulieren, da sie kein Requisiten-verändertes Ereignis auslösen. – zaynetro
Ich habe so etwas wie dies: ''
This room is currently {this.props.roomId}