2016-07-22 13 views
0

Lets sagen, ich habe eine Komponente reagieren, die einen „Zustand“ mit 10 Feldern hat:Reagieren: können Sie SetState mit vorhandenem Statusobjekt verwenden?

this.state = { 
    field1: 1, 
    field2: 2, 
    ... other fields 
    something: 'a' 
}; 

In einem meiner Event-Handler, ich entscheide, ich möchte einen einzigen Staat Feld aktualisieren. Ist es aus irgendeinem Grund schlecht, so etwas zu tun?

// state has 10 other properties not touched here, and I want them to 
// retain their existing values 
this.state.something = 'b'; 
this.setState(this.state); 

Oder muss ich tun:

this.setState({ 
    field1: this.state.field1, 
    field2: this.state.field2, 
    ... set other fields with current value 
    something: 'b' 
}); 

Ich bin mir bewusst, gibt es Bibliotheken, die es einfach zu kopieren Objektzustand machen, nur gefragt, ob es notwendig ist, das zu tun. Ich sollte auch hinzufügen, dass ich das versucht habe und es scheint zu funktionieren, aber ich habe keine Beispiele online gesehen dies tun, also fragte mich, ob es einen Grund gibt, warum nicht.

Antwort

4

NIEMALS thate.state mutieren, da der Aufruf von setState() anschließend die von Ihnen vorgenommene Mutation ersetzen kann. Behandle diesen Zustand so, als wäre er unveränderlich.

Verwendung Object.assign für Klon Objekt

const newState = Object.assign({}, this.state, { 
    something: 'b' 
}) 

this.setState(newState) 

Oder Sie aktuellen Zustand zusammenführen können:

this.setState({ 
    something: 'a', 
    something2: 'b', 
}) 
+0

Danke, genau das, was ich suche. Ich muss es verpasst haben, als ich die Dokumente überflogen habe. – Ben

+1

Wenn Sie diese Informationen verpasst haben, können Sie dies hier lesen https://facebook.github.io/react/docs/component-api.html –

+0

Haben Ihre beiden Beispiele unterschiedliche Auswirkungen? In Bezug auf das Rendern? – drinchev

5

zu aktualisieren Einfeld Sie Objekt mit diesem Feld übergeben müssen. Reagieren wird es für Sie zusammenführen.

this.setState({something: 'b'}) 
+2

Genau, Beispiel - https://jsfiddle.net/69z2wepo/50015/ –

+0

Angenommen, ich wollte 3 von 10 Felder aktualisieren, würde das auch funktionieren und für mich zusammengeführt werden? – Ben

+0

Sicher. '{field1: 1, field2: 2 ...}' –

Verwandte Themen