首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
React
kwoktung
V2EX  ›  React

react 为什么要求数据不可变

  •  1
     
  •   kwoktung · 42 天前 · 693 次点击
    这是一个创建于 42 天前的主题,其中的信息可能已经有所发展或是发生改变。
    类似的库 https://immerjs.github.io/immer/docs/introduction 和 各种教程 react 要求数据不可变;标志性用法 this.setState({ ...state, a: '1' })

    但是其实 this.setState({ a: '1' })就可以。react 本身背自己进行 merge 操作吗。例如进行 object.assign({}, state1, state2);

    本质上 setState 只是做一个“脏标记”,告诉 react 我这个可能组件“脏”,可能需要刷新。那么干什么还要求数据不可变啊。

    有大佬吼一声吗?
    seki
        1
    seki   42 天前
    你说的 setState 的写法没什么问题

    所谓的数据不可变指的是 state 里面的变量不能被 mutate
    比如 state.foo 是一个 array,于是下面的写法就是有问题的

    const { foo } = this.state
    foo.push(1)
    this.setState({ foo })
    shintendo
        3
    shintendo   42 天前
    你举的这个例子,跟数据不可变没什么关系吧
    otakustay
        4
    otakustay   42 天前
    state 是个数据的容器,本身不是数据。state 里面的每一个属性才是数据
    容器没必要不可变,但容器里面的数据必须不可变
    roscoecheung1993
        5
    roscoecheung1993   42 天前
    不可变数据只需要一次浅比较就可以确定整棵子树是否需要更新,merge 视情况可能需要遍历组件树到比较深的层级,在 state 复杂的时候不可变数据会有性能提升。其他好处还包括方便做快照,方便 debug 等等。。
    kwoktung
        6
    kwoktung   42 天前 via Android
    @roscoecheung1993 方便做快照和方便 debug 怎么说?有例子吗?
    roscoecheung1993
        7
    roscoecheung1993   41 天前
    @kwoktung 参考二楼的链接和 react 文档性能优化一节,简单来说数据不可变的结果是每次更新使用全新的一整个对象,更方便记录
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4008 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 05:12 · PVG 13:12 · LAX 22:12 · JFK 01:12
    ♥ Do have faith in what you're doing.