2016-10-24 2 views
3

Ist der folgende Code falsch?React's setState(), Datenmutation für verschachtelte Strukturen, warum nicht direkt den Status ändern?

state={ foo: { bar: true } } // line 1 
setState(state)    // line 2 
state.foo.bar = false   // line 3 
setState(state)    // line 4 

Wenn ja, warum?

This schlagen vor, dass es falsch ist, aber erklärt nicht warum?

Ich denke, es ist nicht falsch ist, aus folgendem Grund:

  • bei line 2vdom1 erstellt
  • bei line 4vdom2 erstellt
  • vdom1 und vdom2 verglichen werden
  • Unterschied ist, propagiert auf das eigentliche DOM

Wenn dies der Fall ist, sollte die Mutation state um line3 keinen Einfluss darauf haben, was bei line4 passiert.

Mit anderen Worten:

diese entsprechende Code sein sollte:

state={ foo: { bar: true } } // line 1 
setState(state)    // line 2 
state={ foo: { bar: false } } // line 3 
setState(state)    // line 4 

Ist dieser Code entspricht dem oben ein?

Wenn nicht, warum nicht?

+0

Dies scheint verwandt zu sein: http://stackoverflow.com/questions/37755997/why-cant-i-directly-modify-a-components-state-really – jhegedus

+0

Ich legte ein Kopfgeld auf diese verwandte Frage: http: // stackoverflow.com/questions/37755997/why-cant-i-directly-modify-a-components-state-really – jhegedus

+0

Dies ist auch verwandt http://stackoverflow.com/questions/28300547/is-it-a-good- practice-to-modify-a-components-state-and-tell-call-setstatediese? rq = 1 gibt aber keine Antwort – jhegedus

Antwort

3

Das Erstellen eines unveränderlichen Zustandsklons ist eine gute Idee, da Zustandsänderungen verglichen werden, um das Rendern zu optimieren.

Im Lebenszyklus werden Methoden wie , nextProps übergeben und können mit this.props verglichen werden.

Wenn Sie den Status direkt mutieren, werden nextProps.prop1 und this.props.prop1 immer gleich sein und daher werden Sie möglicherweise nicht das erwartete Verhalten erhalten.

Ich bin mir sicher, dass es auch andere Gründe gibt, aber dieser scheint am einfachsten zu sein.

+0

Also, wenn ich 'shouldComponentUpdate' nicht verwende, dann gibt es kein Problem? – jhegedus

+1

Es gibt andere Lebenszyklus-Methoden, die auch zum Vergleichen von Requisiten verwendet werden können (wie 'componentWillReceiveProps',' componentWillUpdate' und 'componentDidUpdate'). Und es sollte beachtet werden, dass Sie diese * jetzt * nicht verwenden dürfen, aber die * später * verwenden möchten, wenn die Dinge langsam werden. –

+0

Ich verstehe, danke Davin! – jhegedus

Verwandte Themen