在MobX中使用数组可变操作是否为推荐做法?
MobX配合React开发时的数组操作规范解答
你之前在原生React开发中坚持immutable数组操作的做法是完全正确的,这是原生React状态更新的标准要求。
为什么原生React要求immutable操作?
React的状态更新依赖引用变化检测:当你调用setState更新状态时,React只会对比状态的引用是否发生变化,判断是否需要触发组件重渲染。如果直接用push这类可变方法修改数组,数组本身的引用没有变化,React会认为状态没有更新,就不会触发重渲染,所以必须用扩展运算符、concat等方式返回一个全新的数组,变更引用让React感知到更新。
MobX场景下可以用可变操作的原因
MobX的核心是响应式代理:当你把数组标记为observable(可观察状态)后,MobX会对这个数组做底层代理劫持,所有对数组的操作(包括push、pop、直接修改下标元素等可变操作)都会被MobX监听到,监听到变更后MobX会主动触发对应依赖该状态的React组件重渲染,不需要依赖引用变化来检测更新。
所以官方文档里直接使用push等可变方法是完全符合MobX设计规范的,写法更简洁直观,没有安全问题。
相关注意事项
- 可变操作仅适用于被MobX标记为
observable的状态,普通的React本地状态、非可观察的自定义变量仍然需要遵循原生React的immutable更新规则 - 你之前习惯的immutable写法在MobX场景下仍然可以正常运行,不会出现报错,只是相对来说写法更冗余,没有必要
- 刚上手MobX时可以优先按照官方示例的写法来编写状态更新逻辑,只需要确保你修改的是已经被标记为可观察的状态即可,不会出现意外修改状态导致的更新异常问题
内容的提问来源于stack exchange,提问作者Hidayt Rahman
相关产品推荐
相关产品推荐

