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
相关产品推荐
相关产品推荐

