2016-03-24 11 views
0

質問リダンダントでdefaultStateを返すことは安全ですか?安全でない場合は、状態が突然変異する可能性がある場合、私に例を挙げてください。redux reducer return 'defaultState'は安全ですか?

const defaultState = { 
    test: 'test 
} 

function testReducer(state, action) { 
    switch action.type 
     case RETURN_DEFAULT_STATE: 
     return defaultState; // is this ok to do? or need {...defaultState} 
    default: 
     return state; 
} 

答えて

1

あなたはどこかdefaultStateを変異していないと、それはあなたが望む新しい状態を反映している場合、私はこの問題がどうなるかが表示されません。

あなたの例のコードに変更なしで:ここで

defaultStateが考えられる突然変異させることができる方法のいくつかの例がありますが、とにかく、すでにこれを実行すべきではない

store.dispatch({type: "RETURN_DEFAULT_STATE"}); 
store.getState().x = "x"; 

注意が問題を抱えていますあなたがいる場合。

今、あなたの例のコードの修正版:あなたがある場合

export const defaultState = { 
    test: 'test 
} 

function testReducer(state, action) { 
    switch action.type 
     case RETURN_DEFAULT_STATE: 
     return defaultState; // is this ok to do? or need {...defaultState} 
    default: 
     return someOtherReducer(state, action); 
} 

function someOtherReducer(state, action) { 
    state.x = "x"; 
    return state; 
} 

注すでにsomeOtherReducer()はとにかくで何をしてとすべきでないという問題があります。

import {defaultState} from "whatever"; 

defaultState.x = "x";  
store.dispatch({type: "RETURN_DEFAULT_STATE"}); 
store.dispatch({type: "UNKNOWN"}); 
+0

どうすればdefaultStateを別の場所に変更できますか?あなたは例を挙げることができますか? – Bruce

+1

'store.getState()'で状態を取得して変異させますが、 'defaultState'をどこかで/エクスポートします(これはあなたが投稿したサンプルコードでは明白ではありません)。 – JMM

+0

defaultStateが/ exportを渡すことによってどのように突然変異を起こすことができるかという悪い例を見ていただければ幸いです。現時点では私はそれが起こって見ないが、あなたが言ったようにそれは可能です – Bruce

1

それはとても長いコードを書くすべての開発者が入力パラメータを変異しないように接着しても安全です。私はまだ偶然の突然変異を防ぐためにObject.assignを行うことを提案します。

不良コードサンプル:

const defaultState = { 
    test: 'test' 
}; 

function testReducer(state, action) { 
    switch action.type 
     case RETURN_DEFAULT_STATE: 
     return defaultState; // is this ok to do? or need {...defaultState} 
     case DO_MALICIOS_MUTATION: 
     state.test='foo'; // this might potentially mutate original defaultState object 
     return defaultState; 
    default: 
     return state; 
} 
+0

素敵な例ですね... {defaultState} – Bruce

1

それは限り、あなたはどこにでもそれを変異していないと問題になることはありません。しかし、私はオブジェクトが偶然によって突然変異したために起こったバグを経験したことがあります。したがって、私はあなたの状態がデフォルトの状態オブジェクトをフリーズすることができ変異していないことを確認したい場合はお勧めします:

const defaultState = Object.freeze({ 
    test: 'test 
}); 

あなたは例外を取得strictモードで、このような凍結されたオブジェクトを変更しようとします。

+0

いい素敵なオブジェクト。フリーズする – Bruce

関連する問題