javascript - 不可变地更新 react 中的嵌套状态

标签 javascript reactjs

在我的 React 应用程序中,我有一个名为 parameters 的对象,其状态代表一棵树。

这是我的参数对象:

{
    "Access_List": {
        "state": "override",
        "value": {
            "88": {
                "state": "inherit",
                "value": [{
                    "ip": {
                        "state": "inherit",
                        "value": "19.1.1.1"
                    },
                    "mask": {
                        "state": "override",
                        "value": "0.0.0.0"
                    }
                }]
            }
        }
    }
}

我想要一种通用的方法来更新树上的任何叶子值。我怎样才能做到这一点?例如,我想更新 ip 中的值。

我知道我可以递归地迭代 parameters 对象,并为每个节点提供一个代表其在树中路径的键。例如 ip 将是

"ip":{
        "state":"inherit",
        "value":"19.1.1.1",
        "key":"Access_List.value.88.value.0.ip"  
}

然后我可以使用 lodash deepClone 函数对状态进行深层复制,然后使用 lodash set 改变 ip 的值,如下所示:

set(parameters, `${key}.value`, NEW_VALUE)

最后设置新状态。

这种方式将导致我所有的 child 重新渲染。如何在知道对象路径的情况下永久更新状态。

最佳答案

我建议使用类似immer的东西或immutability-helper 。这使您可以轻松更新不可变的嵌套对象。

对于 immer,你可以这样写:

produce(yourObject, objectState => {
       objectState.Access_List.value.88.value[0].ip.value = 0
});

对于不变性助手:

update(yourObject, {
     Access_List: {
         value: {
             88: {
                 value: {
                    [0]: {
                        ip: {
                           value :{$set: 0}
                       }
                 }
             }
         }
     }
});

这些是更新对象并保持不可变的好方法,可以极大地提高性能。两者都返回新的、不可变的更新对象。 它只更新你想更新的路径,而保留那些你不想更新的对象不变。

如果您使用 redux、mobx 或纯函数/组件,这将防止不必要的重新渲染,因为只有使用对象更新部分的组件才会被重新渲染。

希望这有帮助。快乐编码。

关于javascript - 不可变地更新 react 中的嵌套状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57472769/

相关文章:

javascript - MDL卡片高度定制

javascript - 内联使用 Typescript 声明类型

javascript - Backbone.Layout.extend 和 Backbone.view.extend 的区别

javascript - 获取浏览器创建的请求的响应 header

javascript - 如何使复选框显示在联系表单中

javascript - 在循环中响应 JS/JSX if 语句

javascript - React - 当按钮增加并在另一个页面中呈现结果时增加计数器的最佳方法?

javascript - React - 在发布请求中发送存储的状态值 - 格式错误的数据

reactjs - 类型错误 : Cannot call a class as a function in stenciljs

javascript - ReactJS PreventDefault 当已经传递参数时