我最初在reducer中有以下不可变状态:
const firstState = Map({ "1": {title: "Hello 1", content: "Content 1"}, "2" : {title: "Hello 2", content: "Content 2"} });
现在,在我的reducer中,当EDIT_POST操作进入时,如果用户更改了这些字段,我想更改其中的一些字段。因此,用户只能编辑标题字段(第1号帖子)。然后我希望有一个新的状态,标题字段已更改,但内容字段保持不变。
但是,我不知道该怎么做。
我尝试过一些事情,例如这两件事(在不同的时间):
case 'EDIT_POST': {
var obj = state.get(action.id);
//let newState = state.setIn(['1','title'], 'New Title');
//let newState = state.set("1", {title: "New Title"});
return newState;
}
第一件事根本不起作用,第二件事取消了所有其他价值观。
答案 0 :(得分:2)
setIn
因为您正在混合普通的Javascript对象和immutable.js对象而无法工作。 immutable.js假定整个对象由immutable.js对象组成。
你的地图:
const firstState = Map({ "1": {title: "Hello 1", content: "Content 1"}, "2" : {title: "Hello 2", content: "Content 2"} });
看起来应该更像这样:
const firstState = Map({
"1": Map({ title: "Hello 1", content: "Content 1" }),
"2": Map({ title: "Hello 2", content: "Content 2" })
});
嵌套对象必须是Map的实例或其他不可变类型,然后setIn
才能生效。
如果你有一个普通的JS对象并希望将它转换为不可变对象,你可以使用Immutable.fromJS(someObject)
答案 1 :(得分:0)
您需要setIn()
方法。试试这个。
case 'EDIT_POST': {
var obj = state.get(action.id);
let newState = state.setIn(['1','title'], 'New Title');
return newState;
}