问题是在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;
}
答案 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
});
如果您尝试在严格模式下修改此类冻结对象,则会出现异常。