【问题标题】:Vue 3 - Make the specific class properties reactiveVue 3 - 使特定的类属性具有反应性
【发布时间】:2021-06-05 04:07:00
【问题描述】:

是否有可能使类实例的某些属性具有反应性?

在 MobX 中这很容易做到:

class Doubler {
    constructor(value) {
        makeObservable(this, {
            value: observable,
            double: computed,
        })
        this.value = value
    }

    get double() {
        return this.value * 2
    }
}

但在 Vue 中似乎无法做到。

1.我得到的最接近的结果是以下结果:

class Doubler {
    constructor(value) {
        this.value = ref(value)
        this.double = computed(() => this.value.value * 2) // Ugly
    }
}

计算出来的代码很丑,而且使用起来也不同:

const doubler = new Doubler(1)
double.value = 2 // No way!
double.value.value = 2 // That's it! Ugly, but that's it.

2.我可以将创建的对象传递给reactive函数,但它会使所有属性反应,并且不影响内部实现,它仍然会很丑。

有没有办法在 Vue 中重现 MobX 方法?

【问题讨论】:

  • 你可以将一个反应性的属性传递给你的类的构造函数,比如this

标签: vue.js vuejs3 vue-reactivity


【解决方案1】:

我不认为你可以通过类来实现它。不过,对于对象,我能想到的最接近的事情是这样的:

function createDoubler(value) {
  const doubler = reactive({ value })
  doubler.double = computed(() => state.value * 2)
  return doubler
}

const doubler = createDoubler(4)
doubler.value // 4
doubler.value = 5
doubler.double // 10

编辑:在给它另一个想法之后,我想出了以下解决方案:

class Doubler {
  constructor(value) {
    this._state = reactive({ value });
  }

  get value() {
    return this._state.value;
  }

  set value(value) {
    return this._state.value = value;
  }

  get double() {
    return this._state.value * 2;
  }
}

如果你想使用ref 而不是reactive

class Doubler {
  constructor(value) {
    this._value = ref(value);
  }

  get value() {
    return unref(this._value);
  }

  set value(value) {
    return this._value = value;
  }

  get double() {
    return this.value * 2;
  }
}

Link to CodeSandbox

【讨论】:

  • 感谢您的回答!
猜你喜欢
  • 2021-06-04
  • 2018-07-20
  • 2019-04-10
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 2019-07-21
  • 2019-02-05
相关资源
最近更新 更多