You need to enable JavaScript to run this app. 使用Mobx的makeAutoObservable时this未绑定无法读取counter错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

使用Mobx的makeAutoObservable时this未绑定无法读取counter错误如何解决

问题根因

你报错的核心原因是 makeAutoObservable 默认不会自动绑定类方法的this指向:
你之前用makeObservable时显式给increment、decrement加了action.bound配置,会自动把两个方法的this绑定到store实例,所以你在组件里直接解构方法出来当点击回调不会有问题。
但切换成makeAutoObservable之后没有配置自动绑定,你在组件里解构increment、decrement两个方法的时候,就把方法和store实例的上下文切断了,点击触发方法时this指向为undefined,自然读不到this.counter。

可用解决方案

  • 方案1:给makeAutoObservable开启自动绑定配置
    直接修改store的构造函数,给makeAutoObservable传入第三个配置项开启autoBind即可,和你之前用action.bound的效果完全一致:
    constructor(arg) {
      // 第三个参数为全局配置,autoBind设为true会自动绑定所有方法的this到实例
      makeAutoObservable(this, {}, { autoBind: true });
    }
    
  • 方案2:组件调用时不直接解构方法,或者调用时绑定上下文
    不解构方法,调用的时候直接通过实例访问即可保留上下文:
    // 组件里修改写法,不单独提取方法
    const { sampleStore } = store;
    // 渲染部分直接通过实例调用方法
    <button onClick={() => sampleStore.increment()}>+</button>
    <button onClick={() => sampleStore.decrement()}>-</button>
    
  • 方案3:把store的方法改成箭头函数写法
    箭头函数会继承类实例的this指向,解构后也不会丢失上下文:
    class SampleStore {
      counter = 0;
    
      constructor(arg) {
        makeAutoObservable(this);
      }
      // 改成箭头函数绑定this
      increment = () => {
        this.counter++;
        return this.counter;
      }
      decrement = () => {
        this.counter--;
        return this.counter;
      }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 00:18:04