Javascript redux减速器回油';默认状态';这样做安全吗?
问题是在reducer中返回defaultState是否安全。如果不安全,请给我一个例子,当有机会的国家得到变异Javascript redux减速器回油';默认状态';这样做安全吗?,javascript,ecmascript-6,redux,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 ne
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;
}
如果您没有在其他地方更改
defaultState
,并且它反映了您想要的新状态,那么我看不出问题出在哪里
以下是一些可以想象的defaultState
如何变异的示例:
在不修改示例代码的情况下:
store.dispatch({type:“RETURN\u DEFAULT\u STATE”});
store.getState().x=“x”;
请注意,无论如何你都不应该这样做,如果你这样做的话,你已经有问题了
现在,是示例代码的修改版本:
export const defaultState={
测试:'测试
}
函数testReducer(状态、操作){
开关动作类型
案例返回\默认\状态:
return defaultState;//可以这样做吗?或者需要{…defaultState}
违约:
返回其他减速器(状态、动作);
}
函数someOtherReducer(状态、操作){
state.x=“x”;
返回状态;
}
请注意,无论如何,您都不应该做someOtherReducer()
所做的事情,如果您这样做的话,您已经有问题了
从“whatever”导入{defaultState};
defaultState.x=“x”;
store.dispatch({type:“RETURN\u DEFAULT\u STATE”});
dispatch({type:“UNKNOWN”});
如果你没有在其他地方变异defaultState
,它反映了你想要的新状态,我看不出问题出在哪里
以下是一些可以想象的defaultState
如何变异的示例:
在不修改示例代码的情况下:
store.dispatch({type:“RETURN\u DEFAULT\u STATE”});
store.getState().x=“x”;
请注意,无论如何你都不应该这样做,如果你这样做的话,你已经有问题了
现在,是示例代码的修改版本:
export const defaultState={
测试:'测试
}
函数testReducer(状态、操作){
开关动作类型
案例返回\默认\状态:
return defaultState;//可以这样做吗?或者需要{…defaultState}
违约:
返回其他减速器(状态、动作);
}
函数someOtherReducer(状态、操作){
state.x=“x”;
返回状态;
}
请注意,无论如何,您都不应该做someOtherReducer()
所做的事情,如果您这样做的话,您已经有问题了
从“whatever”导入{defaultState};
defaultState.x=“x”;
store.dispatch({type:“RETURN\u DEFAULT\u STATE”});
dispatch({type:“UNKNOWN”});
只要编写代码的所有开发人员都坚持不改变输入参数,这是安全的。我仍然建议做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;
}
只要编写代码的所有开发人员都坚持不改变输入参数,这是安全的。我仍然建议做
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;
}
只要你不在任何地方变异它就不会有问题。然而,我碰巧遇到了一个错误,它是由一个对象意外变异引起的。因此,我建议如果您想确保您的状态没有发生变化,可以冻结默认状态对象:
const defaultState = Object.freeze({
test: 'test
});
如果您试图在严格模式下修改这样一个冻结的对象,您会得到一个异常。只要您不在任何地方对其进行变异,这应该不会是一个问题。然而,我碰巧遇到了一个错误,它是由一个对象意外变异引起的。因此,我建议如果您想确保您的状态没有发生变化,可以冻结默认状态对象:
const defaultState = Object.freeze({
test: 'test
});
如果您试图在严格模式下修改这样一个冻结的对象,您会得到一个异常。我如何在其他地方修改defaultState?你能提供一个例子吗?通过在后续的缩减器中改变状态,通过使用
store.getState()
检索状态并改变它,但是在某个地方传递/导出defaultState
(这在你发布的示例代码中不明显)如果能看到一个通过传递/导出来改变defaultState的坏例子,那就太好了。目前我看不到这种情况发生,但正如你所说的,有可能用一些例子进行更新。最好坚持使用{…defaultState}我怎么能在其他地方变异defaultState?你能提供一个例子吗?通过在后续的缩减器中改变状态,通过使用store.getState()
检索状态并改变它,但是在某个地方传递/导出defaultState
(这在你发布的示例代码中不明显)如果能看到一个通过传递/导出来改变defaultState的坏例子,那就太好了。目前我看不到这种情况发生,但正如你所说,有可能用一些例子来更新。最好还是坚持用{…defaultState}好例子。。。是的,可能坚持{…defaultState}很好的例子。。。是的,可能坚持使用{…defaultState}很好的对象。这是个好东西。冻结