redux reducer return' defaultState'这样做安全吗?

时间:2016-03-24 12:52:23

标签: javascript ecmascript-6 redux

问题是在reducer中返回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;
}

3 个答案:

答案 0 :(得分: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"});

答案 1 :(得分: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;
}

答案 2 :(得分:1)

只要你不在任何地方改变它,它就不会成为一个问题。但是,我偶然遇到了一个因意外发生变异而导致的错误。因此,我建议如果您想确保状态未发生变异,可以冻结默认状态对象:

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

如果您尝试在严格模式下修改此类冻结对象,则会出现异常。