【问题标题】:Is it advisable to use mutable operations for array in mobx?是否建议在 mobx 中对数组使用可变操作?
【发布时间】:2021-09-09 14:40:00
【问题描述】:

每次在react我都关心immutable array operations 避免通过mutable operations 发生意外状态更改

我经常使用immutable operations

每当我需要添加新项目时,我都会使用它

[...myArr, 'newItem'];

而不是可变操作

myArr.push('newItem');

但是,我在official doc 上看到了mobx 的示例,我很惊讶,因为他们使用了push() 方法。

我是mobx的初学者,不敢用mutable operation
有人知道吗?

我做错了吗,或者我可以在 mobx 上进行 mutable 操作并做出反应吗?

【问题讨论】:

    标签: javascript reactjs mobx mobx-react mobx-react-lite


    【解决方案1】:

    这些操作有不同的语义和结果,一切都取决于你的目标是什么。

    你需要通知所有可观察对象这个数组发生了变化吗?然后创建新数组,例如 [...myArr, 'newItem']; 或您喜欢的任何其他方式。

    您只需要向数组中添加一个项目吗?使用push

    例如,每个具有该数组的 deps 的 useEffect 都会在第一种情况下做出反应,但在您 push 时在第二种情况下不会有任何影响:

    useEffect(() => {
      // ...
    }, [myArray])
    

    【讨论】:

    • 你的意思是我可以根据情况使用任何人?但相信我,我看到了很多 react 的帖子,它们限制使用这些可变方法 push() splice()
    • 是的,您可以将两者与 MobX 一起使用。 React 实际上没有观察者和响应式数据,所以如果你使用纯 React 状态,最好坚持使用不可变的方法。
    • 谢谢,你救了我的大脑被弄乱了:)
    • @HidaytRahman 如果您的问题已解决,请标记为已接受,谢谢
    【解决方案2】:

    带有 ... 的扩展运算符创建一个新数组,该数组需要分配一些内存。因此,与push 相比,它有点昂贵

    let arr = [1, 2, 3];
    let arr2 = [...arr]; // like arr.slice()
    
    arr2.push(4);
    //  arr2 becomes [1, 2, 3, 4]
    //  arr remains unaffected
    

    阅读更多here

    【讨论】:

    • 哦,太好用了,可以和spread结合使用..谢谢!
    猜你喜欢
    • 2019-11-26
    • 1970-01-01
    • 2016-06-13
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多