Vue 3 - 使特定 class 属性具有反应性
Vue 3 - Make the specific class properties reactive
是否有可能使 class 实例的某些属性具有反应性?
在 MobX 中这很容易做到:
class Doubler {
constructor(value) {
makeObservable(this, {
value: observable,
double: computed,
})
this.value = value
}
get double() {
return this.value * 2
}
}
但在 Vue 中似乎不可能做到。
1.The 我得到的最接近的结果是以下结果:
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.I 可以将创建的对象传递给 reactive
函数,但它使 所有属性 反应并且它不影响内部实现并且它还是会丑
有什么方法可以在 Vue 中重现 MobX 方法吗?
我认为 类 无法实现。但是对于对象,我能想到的最接近的东西是这样的:
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;
}
}
是否有可能使 class 实例的某些属性具有反应性?
在 MobX 中这很容易做到:
class Doubler {
constructor(value) {
makeObservable(this, {
value: observable,
double: computed,
})
this.value = value
}
get double() {
return this.value * 2
}
}
但在 Vue 中似乎不可能做到。
1.The 我得到的最接近的结果是以下结果:
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.I 可以将创建的对象传递给 reactive
函数,但它使 所有属性 反应并且它不影响内部实现并且它还是会丑
有什么方法可以在 Vue 中重现 MobX 方法吗?
我认为 类 无法实现。但是对于对象,我能想到的最接近的东西是这样的:
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;
}
}