2016-10-24 2 views
3

次の反応コードが間違っていますか?反復のsetState()、ネストされた構造体のデータの突然変異、なぜ状態を直接変更しないのですか?

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

そうであれば、なぜですか?

Thisは、それが間違っていることを示唆しているが、理由を説明しないのですか? line 2vdom1

  • 差があると比較されているline 4vdom2
  • vdom1vdom2を作成されます作成されます。

    私はそれは以下の理由のために、間違っはないと思います実際のDOMに伝播します

この場合、stateline3に変更しても、line4に何も起こりません。言い換えれば

これは同等のコードのようになります。

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

は、上記1に、このコードと同等ですか?

ない場合、その理由は?状態の不変のクローンを作成する

+0

これは関連しているようです:http://stackoverflow.com/questions/37755997/why-cant-i-directly-modify-a-components-state-really – jhegedus

+0

私はこの関連する質問に賞金を入れました:http:// stackoverflow.com/questions/37755997/why-cant-i-directly-modify-a-components-state-really – jhegedus

+0

これもhttp://stackoverflow.com/questions/28300547/is-it-a-good-関連しています実践・ツー・修正・コンポーネント-状態とし、その後、コールsetstatethis?RQ = 1が、答え – jhegedus

答えて

3

ため、レンダリングを最適化するために、状態の変化を比較する方法の良いアイデアです。

shouldComponentUpdateのようなライフサイクルのメソッドでは、nextPropsが渡され、this.propsと比較することができます。

状態を直接変更すると、nextProps.prop1this.props.prop1は常に同じ状態になるため、予想される動作が得られないことがあります。

私は他の理由はそこにもあると確信しているが、これは最もストレートフォワードのように思えます。

+0

だから私は使用していない場合は 'shouldComponentUpdate'はその後、問題が無けれを与えるものではありませんか? – jhegedus

+1

他のライフサイクルメソッドもあります( 'componentWillReceiveProps'、' componentWillUpdate'、 'componentDidUpdate'など)。そして、あなたはこれらの* now *を使用することはできませんが、遅くなると*後の*を使いたいことに注意してください。 –

+0

私はDavinに感謝します! – jhegedus

関連する問題