Reactjs Redux reducer-它是否会改变状态?
我遇到了以下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 =
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