2017-05-06 7 views
1

私はreduxストアが正しく更新される問題を追跡していますが、コンポーネントは変更を反映していません。私は状態を変更していないことを確認するための複数の方法を試しましたが、問題は解決しません。 ()を呼び出し、私は通常Object.assignを入れ子に使用し、私のcopyState機能についてはJSON.parse(JSON.stringify(state))はredux状態の突然変異を保証していませんか?

case 'ADD_OBJECT_TO_OBJECT_OF_OBJECTS': { 
    newState = copyState(state); 
    newState.objectOfObjects[action.id] = action.obj; 
    return newState; 
} 

が、エラーを回避することはそれほど単純ではありません:私の減速は、一般的に形を取ります。テストのために、私は状態を変異ていないよ確認するために、それは関係なく、プロセスがどのように高価なの、(Reduxの)状態を変異しないことが保証方法として

const copyState = (state) => { 
    return JSON.parse(JSON.stringify(state)); 
}; 

を使用するのが正しいのですか?

もしそうでなければ、私が状態を変更していないことを保証するために頼ることができる他の深いコピー方法はありますか?

編集: 他の人が同じ問題を抱えている可能性があることを考慮して、私は問題を解決するようにします。

私はアクションをディスパッチしようとしていましたが、その後、行の前の行で更新されたストアからデータにアクセスしようとしました。

dispatchAction(data) // let's say this updates a part of the redux state called 'collection' 
console.log(this.props.collection) // This will not be updated! 

これは関係なく、それがどのように高価なの、深いクローンを行いはいhttps://github.com/reactjs/redux/issues/1543

+0

'state'は、それはそれを変異させる' .toJSON'方法をstate' '与えることができる(しかし、信じられないほどダム)となり' copyState' –

+0

にそのままとなります。 – Bergi

答えて

0

を参照してください。難しい点は、stateが他のどこにも残っていないことを確認することです。

他のアプローチを求めており、コメントには収まらないので、私はImmutableJSを調べることをお勧めします。これは状態変化のバグを追跡する問題を排除します。

const { Map } = require('immutable') 
const map1 = Map({ a: 1, b: 2, c: 3 }) 
const map2 = map1.set('b', 50) 
map1.get('b') // 2 
map2.get('b') // 50 
+0

ありがとうございました。しかし、私はreduxの基本的な誤解を持っていないことを確認したい。あなたは「状態が他のどこにも触れられていないことを確認してください」と言いました。 テストするために、すべての単一レデューサーでこのJSON.parse()アプローチを使用しました。それでも、ストアは正しく更新されます(ミドルウェアはアクションディスパッチ後に 'nextState'に変更を表示します)、コンポーネントはこれらの変更を反映しません。 これは、問題が複製されていない状態を必要としないことを確認していないことを意味するのでしょうか、またはcopyStateの実装でreduxがどのように機能するかを誤解していますか? – underscore

+0

私はあなたが誤解していないと思う...私はどちらかではないことを願っています:)私はまたreduxについての初心者ですが、あなたの 'copyState'関数は、パフォーマンス)。だから問題は他の場所にあるようだ: –

関連する問題