You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MobX严格模式下构造函数调方法改属性无报错及无@action改属性问题咨询

MobX严格模式下的常见疑问解答

嘿,这两个问题其实都是MobX针对实例初始化阶段的特殊规则导致的,我来给你拆解清楚:

1. 为何MobX允许无需@action装饰器即可修改该属性?

在你开启了configure({ enforceActions: true })的严格模式下,构造函数内部的代码是默认被豁免的——MobX认为构造函数本来就是用来初始化实例状态的地方,所以不管是直接修改@observable属性,还是调用未标记@action的方法来修改,都不会触发严格模式的报错。这是框架特意留的例外,方便我们在实例创建时完成初始状态的设置。

2. 为何MobX在严格模式下,允许通过构造函数调用的toggle方法修改flag属性?

原因和上面的规则一脉相承:MobX会把构造函数内部直接调用的所有方法,都视为初始化流程的一部分,自动赋予它们修改可观察属性的权限,哪怕这些方法没有被@action装饰器标记。

你可以做个小测试:如果在实例化完成后再调用t.toggle(),这时候就会触发你预期的“mobx is in strict mode, you should use an action”报错了——因为这时候已经脱离了初始化阶段,必须用@action来包裹修改可观察状态的代码。

附上你的测试代码:

import { configure, autorun } from 'mobx';
import { observable, action, computed } from 'mobx';
configure({ enforceActions: true });
class Test {
  @observable flag = false;
  constructor() {
    this.toggle();
  }
  toggle() {
    this.flag = !this.flag;
  }
}
var t = new Test();
autorun(function test () {
  console.log(t.flag);
})

内容的提问来源于stack exchange,提问作者cdarwin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:33:24