【问题标题】:ImmutableJS - Update only one key-value in ObjectImmutableJS - 仅更新 Object 中的一个键值
【发布时间】:2017-08-01 09:55:54
【问题描述】:

我的减速器最初具有以下不可变状态:

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

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

【问题讨论】:

    标签: javascript reactjs immutability immutable.js


    【解决方案1】:

    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)

    【讨论】:

    • 这太棒了,正是我需要的答案!非常感谢!
    【解决方案2】:

    你需要setIn() 方法。试试这个。

    case 'EDIT_POST': {
        var obj = state.get(action.id);
    
        let newState = state.setIn(['1','title'], 'New Title');
        return newState;
    }
    

    【讨论】:

    • 这是我已经尝试过的。对不起,上面有一个错字,我现在会更正,但我确实尝试了setIn 方法。
    • @GeorgeWelder 创建不可变状态时,您是否尝试过使用Immutable.fromJS() 而不是Map()
    • 不,现在就试试。这会创建一个地图吗?
    • 从文档中我得到'fromJS() 将纯 JS 对象和数组深度转换为不可变映射和列表。'
    猜你喜欢
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2015-07-18
    • 2023-04-02
    • 2021-05-21
    相关资源
    最近更新 更多