2017-01-30 5 views
1

私の状態は次のようになります場合:Reduxディープコピーアレイが変更されない場合でも

const initialState = { 
    color: 'blue', 
    sizes: ['S', 'M', 'L'], 
} 

そして、私は色を変更したい、私の減速は、この権利を返す必要があります:

return { ...state, color: newColor }; 

しかし、状態はまだ古い配列を参照しませんが?配列を変更していなくても、これは突然変異とみなされますか?これは良いでしょうか?

return { 
    ...state, 
    color: newColor, 
    sizes: state.map.sizes(size => size) 
} 

配列にオブジェクトが含まれている場合はどうなりますか?

const initialState = { 
    color: 'blue', 
    sizes: [ 
    { color: 'red', size: 'S' }, 
    { color: 'green', size: 'M' }, 
    { color: 'blue', size: 'L' } 
    ], 
} 

これは、状態の変異を避けるためにこれを行う必要があるということですか?

return { 
    ...state, 
    color: newColor, 
    sizes: state.map.sizes(item => { ...item }) 
} 



また、Object.assignと拡散演算子はJSON.stringifyとJSON.parseをやっよりも好まれる理由はありますか?

答えて

1

いいえ、突然変異ではありません。あなたがしていることはまったく問題ありません。

は、見てください:第2の目的は、作成されているときに、時間がない時に

const obj1 = { 
    a: 1, 
    b: 2, 
    c: 3 
}; 

const obj2 = { 
    ...obj1, 
    c: 4 
}; 

は、変更される最初のオブジェクトの任意のメンバーです。

参考文献がの読み取り専用である限り、Reduxの状況(または実際には、FPコードベースの任意の時点で、純粋な関数を使用して)では、参照の共有に問題はありません。

これは、新しいオブジェクトを作成するときに、そのサブプロパティが変更されていない限り、そのプロパティが他のオブジェクトのプロパティに直接参照できることを意味します(これらのサブプロパティは共有オブジェクト)。

+0

これは私がしばらくして実現したものです。古い状態と新しい状態の両方が同じ配列を参照するかどうかは問題ではありません。変更しなかったからです。私はまだ平等チェックを実行し、必要に応じて前の状態に戻ることができます。 – epiqueras

+0

@epiquerasだからこそ、それは素晴らしい練習です。何かをコピーして変更しないように規律を高めれば、素早く簡単にアイデンティティをチェックできます。もちろん、さまざまな味のライブラリ(ImmutableJSやさまざまなFPレンズライブラリ)がありますが、あなた自身であれ、熱心なチームであれば、この方法でバニラJSオブジェクトを使用することはできません。特に将来の投機的なオブジェクトの休憩/スプレッドパターン。 – Norguard

+0

はい、私は複雑な配列とネストされたプロパティの変更を扱うとき、これが痛みになることを完全に見ることができます。私はちょうどそれらのライブラリのいくつかをチェックアウトし、私はこれまでより複雑な操作を行う必要がある場合は、間違いなくそれらを使用します。私はまた、減速機を構成し、それを避けるために可能な限り平らな状態を保つようにしています。 – epiqueras

関連する問題