在存在 getter 的情况下使用 Mobx makeObservable 让 setter 成为一个动作

2023-12-04

在 mobx 中,如果我想使用继承,我需要使用 makeObservable 而不是 makeAutoObservable。但是使用 makeObservable 需要我命名改变状态的操作,那么如何将 setter 声明为操作,因为它与 getter 具有相同的名称?

换句话说,我写的 SETTER_FOR_MYVAR 的位置是什么,或者达到相同效果的另一种方法是什么?

class BaseClass {
  _myvar = null

  set myvar(val) {
    this._myvar = val;
  }

  get myvar() {
    return this._myvar;
  }

  other_action() {
    this._myvar = 5;
  }

  constructor() {
    makeObservable(this, {
      _myvar: observable,
      other_action: action,
      SETTER_FOR_MYVAR: action
    });
  }
}

是的,我知道我可以将其外包给另一个辅助函数 _myvar_setter 并声明一个操作,但这看起来很难看,我希望有更好的方法。


只需标记myvar as computed,一切都应该开箱即用(如果我正确理解你想要什么):

  constructor() {
    makeObservable(this, {
      _myvar: observable,
      myvar: computed,
      other_action: action
    });
  }

代码沙箱

摘自文档:

也可以为计算值定义一个设置器。请注意,这些设置器不能用于直接更改计算属性的值,但它们可以用作推导的“逆”。 Setter 会自动标记为操作。

Example:

class Dimension {
    length = 2

    constructor() {
        makeAutoObservable(this)
    }

    get squared() {
        return this.length * this.length
    }
    set squared(value) {
        this.length = Math.sqrt(value)
    }
}

文档中的更多信息

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在存在 getter 的情况下使用 Mobx makeObservable 让 setter 成为一个动作 的相关文章

随机推荐