Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript redux减速器回油';默认状态';这样做安全吗?_Javascript_Ecmascript 6_Redux - Fatal编程技术网

Javascript redux减速器回油';默认状态';这样做安全吗?

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

问题是在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;
}

如果您没有在其他地方更改
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}很好的对象。这是个好东西。冻结