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

Pet*_*des 3 javascript setter ecmascript-6 mobx es6-class

在 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
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*ila 8

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

  constructor() {
    makeObservable(this, {
      _myvar: observable,
      myvar: computed,
      other_action: action
    });
  }
Run Code Online (Sandbox Code Playgroud)

代码沙箱

摘自文档:

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

例子:

class Dimension {
    length = 2

    constructor() {
        makeAutoObservable(this)
    }

    get squared() {
        return this.length * this.length
    }
    set squared(value) {
        this.length = Math.sqrt(value)
    }
}
Run Code Online (Sandbox Code Playgroud)

文档中的更多信息