Vue3 不以与 Vue2 相同的方式对 class 字段内部更新作出反应
Vue3 does not react to class field internal updates in the same way as Vue2
我注意到,在 Vue2 中,您可以将一个元素绑定到 class 的 属性,并且当此 class 属性 是时,该元素将更新从 Vue 世界之外的某个地方更改,这在 Vue3 中似乎是不可能的。
我在这里创建了两个简单的例子来说明我的意思:
Vue2:https://codesandbox.io/s/vue2-6hztv
Vue3:https://codesandbox.io/s/vue3-o2rfn
有一个 class 有一个内部计时器,它会递增 class 字段。在 Vue2 中,绑定到 myClass.field
的元素已正确更新,但在 Vue3 中没有任何反应。
我的问题是
1.为什么这里Vue2和Vue3有区别?
2。我怎样才能在 Vue3 中实现类似于工作 Vue2 示例的东西?
请注意,我不能 运行 Vue 生命周期方法中的计时器。 class字段需要自行更新
这是不起作用的 Vue3 代码:
HTML:
<div id="app">{{ myClass.field }}</div>
Javascript:
class MyClass {
field = 0;
constructor() {
setInterval(() => {
this.field++;
}, 1000);
}
}
export default {
data() {
return {
myClass: new MyClass(),
};
},
};
如 中所述,在 Vue 3 中创建代理对象以启用反应性。构造函数中的 this
指的是原始 class 实例而不是代理,因此它不能是反应式的。
解决方案是将 class 构造函数和期望 this
反应的副作用的设置分开。设置方法可以实现流畅的界面模式,使其更易于使用:
class MyClass {
field = 0;
init() {
setInterval(() => {
this.field++;
}, 1000);
return this;
}
}
在选项 API 中是:
data() {
return {
myClass: new MyClass(),
};
},
created() {
this.myClass.init();
}
组成API是::
const myClass = reactive(new MyClass()).init();
我注意到,在 Vue2 中,您可以将一个元素绑定到 class 的 属性,并且当此 class 属性 是时,该元素将更新从 Vue 世界之外的某个地方更改,这在 Vue3 中似乎是不可能的。
我在这里创建了两个简单的例子来说明我的意思:
Vue2:https://codesandbox.io/s/vue2-6hztv
Vue3:https://codesandbox.io/s/vue3-o2rfn
有一个 class 有一个内部计时器,它会递增 class 字段。在 Vue2 中,绑定到 myClass.field
的元素已正确更新,但在 Vue3 中没有任何反应。
我的问题是
1.为什么这里Vue2和Vue3有区别?
2。我怎样才能在 Vue3 中实现类似于工作 Vue2 示例的东西?
请注意,我不能 运行 Vue 生命周期方法中的计时器。 class字段需要自行更新
这是不起作用的 Vue3 代码:
HTML:
<div id="app">{{ myClass.field }}</div>
Javascript:
class MyClass {
field = 0;
constructor() {
setInterval(() => {
this.field++;
}, 1000);
}
}
export default {
data() {
return {
myClass: new MyClass(),
};
},
};
如 this
指的是原始 class 实例而不是代理,因此它不能是反应式的。
解决方案是将 class 构造函数和期望 this
反应的副作用的设置分开。设置方法可以实现流畅的界面模式,使其更易于使用:
class MyClass {
field = 0;
init() {
setInterval(() => {
this.field++;
}, 1000);
return this;
}
}
在选项 API 中是:
data() {
return {
myClass: new MyClass(),
};
},
created() {
this.myClass.init();
}
组成API是::
const myClass = reactive(new MyClass()).init();