ImmutableJS - 仅更新对象

时间:2017-08-01 09:55:55

标签: javascript reactjs immutability immutable.js

我最初在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;
      }

第一件事根本不起作用,第二件事取消了所有其他价值观。

2 个答案:

答案 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;
}