2016-04-24 10 views
2

javascriptオブジェクトを追加/プッシュしようとしています(この 'セッション'としましょう)this.state.sessions。ネストされたオブジェクトをプッシュするときに反応状態が変化する

私はこの二つの方法を試みた

:浅いデータ(例えばsessions[i].locationながら

var newState = React.addons.update(this.state, { 
      sessions : { 
       $push : [session] 
      } 
     }); 
this.setState(newState); 

のリアクト不変ヘルパーを使用して)

this.setState({sessions: this.state.sessions.concat(session)}); 

2新しいセッションをConcat'ing
1))が正しく追加されている場合、問題はすべての以前のセッションのスコープが新しいsession.scopeに設定されていることです。下の画像リンクでは、最初のセッションのスコープ値(sessions[0].scope)が、2番目のセッションのスコープ値(sessions[1].scope)によって上書きされたことがわかります。新しいセッションを追加する際に、以前のセッションの値に影響を与えないようにするにはどうすればよいですか?

addSession = (newSession) => { 
    let tempArray = this.state.sessions.slice(); 
    tempArray.push(newSession); 
    this.setState({sessions: tempArray}); 
} 

上記sessions配列のシャローコピーを作成し、一時的な変数に代入します:sessions以来

App state picture

答えて

1

これは反応とはあまり関係がなく、sessions[0].scopeのオブジェクトが参照としてコピーされている可能性があります。そのscopeオブジェクトは、古いセッション値と新しいセッション値の間で参照共有されることがあります。

+0

私は答えとしてこれをマークしています。元のコードベースでこの問題を解決していませんが、私は単純なアプリケーション(まだ子コンポーネントがある)とスコープの更新を期待どおりに作成しました。 – Kunal

1

が配列で、私は次のようやったでしょう。次に、新しいセッションを配列にプッシュし、完了したらthis.state.sessionsを新しい変数で上書きします。

+0

Chrisさん、ありがとうございました。でも、同じ問題が残っていましたが、私は次のような奇妙な点に注意しました。let 'let tempArray = this.state.sessions.slice(); 'の後にブレークポイントを設定しました。スコープ 'sessions [0] .scope = []'のないセッションとスコープ 'sessions [1] .scope = [{id:1、...}]を持つセッションの2つを追加しました。奇妙なのは、tempArrayがすでに第2セッションのスコープ、すなわち第1セッションスコープ、すなわち 'session [0] .scope == session [1] .scope 'を適用したことです。 – Kunal

関連する問題