Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.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
Reactjs Redux reducer-它是否会改变状态?_Reactjs_Redux_React Redux - Fatal编程技术网

Reactjs Redux reducer-它是否会改变状态?

Reactjs Redux reducer-它是否会改变状态?,reactjs,redux,react-redux,Reactjs,Redux,React Redux,我遇到了以下redux reducer,虽然它工作正常,但我认为它是错误的: export default (state = initState, action) => { switch (action.type) { case RESET_SCREEN: return Object.assign({}, state, initState); case MODIFY_ITEM: let itemId =

我遇到了以下redux reducer,虽然它工作正常,但我认为它是错误的:

export default (state = initState, action) => {
    switch (action.type) {
        case RESET_SCREEN:
            return Object.assign({}, state, initState);
        case MODIFY_ITEM:
            let itemId = state.item.id;
            state.items[itemId].item = action.item;
            return Object.assign({}, state, {items: state.items});
    }
}
重置屏幕之所以好是因为它没有改变状态,而修改项目部分之所以坏是因为它改变了状态,这是正确的吗?在什么情况下会受伤?(因为应用程序当前的行为符合预期)


修改项目的备选方案是什么?

您正在更改此行中的前一个状态

state.items[itemId].item = action.item;

您正在更改此行中的上一个状态

state.items[itemId].item = action.item;
您可以使用npm

它是一个很小的包,允许您以更方便的方式处理不可变状态。它基于。您可以使用npm


它是一个很小的包,允许您以更方便的方式处理不可变状态。它基于。

为了保持状态的不变性,您可以像这样编写
MODIFY\u项
操作处理程序:

case MODIFY_ITEM:
    let itemId = state.item.id;
    return {...state, items: state.items.map((item, index) => {
        return index === itemId ? action.item : item
    })}

为了保持状态的不变性,您可以像这样编写
MODIFY\u项
操作处理程序:

case MODIFY_ITEM:
    let itemId = state.item.id;
    return {...state, items: state.items.map((item, index) => {
        return index === itemId ? action.item : item
    })}
重置屏幕是好的,因为它没有变异,这是正确的吗 国家

是的,这是正确的

但是,MODIFY_项部分是坏的,因为它会发生变异

否,
MODIFY_项
不会改变状态:

此行:
state.items[itemId].item=action.item
变异对象(不是状态),但是
redux
不关心局部对象的变异——它甚至不知道

只要返回一个新引用——对象的新副本,
redux
就会将其视为有效的新状态

因此,根据redux,
这是一种状态突变:

case MODIFY_ITEM:
        let itemId = state.item.id;
        state.items[itemId].item = action.item;
        return state; // <-- because you are returning the same reference. BAD
case MODIFY_ITEM:
    let itemId = state.item.id;
    state.items[itemId].item = action.item;
    return Object.assign({}, state, {items: state.items}); // <- A new Object. GOOD
case-MODIFY\u项目:
让itemId=state.item.id;
state.items[itemId].item=action.item;
返回状态;//
重置屏幕是好的,因为它没有变异,这是正确的吗
国家

是的,这是正确的

但是,MODIFY_项部分是坏的,因为它会发生变异

否,
MODIFY_项
不会改变状态:

此行:
state.items[itemId].item=action.item
变异对象(不是状态),但是
redux
不关心局部对象的变异——它甚至不知道

只要返回一个新引用——对象的新副本,
redux
就会将其视为有效的新状态

因此,根据redux,
这是一种状态突变:

case MODIFY_ITEM:
        let itemId = state.item.id;
        state.items[itemId].item = action.item;
        return state; // <-- because you are returning the same reference. BAD
case MODIFY_ITEM:
    let itemId = state.item.id;
    state.items[itemId].item = action.item;
    return Object.assign({}, state, {items: state.items}); // <- A new Object. GOOD
case-MODIFY\u项目:
让itemId=state.item.id;
state.items[itemId].item=action.item;

返回状态;//<代码>状态。项目是一个对象。你怎么知道的?根据这个问题,它也可能是一个对象数组。
state.items
是一个对象。你怎么知道的?根据问题,它也可能是一个对象数组。请显示
initState
的结构请显示
initState