Vue3 对象渲染无效,但 vue2 成功
Vue3 object render invalid,but vue2 success
一个简单的演示
HTML 模板
<div id="app">{{ temp.progress }}</div>
实例化对象
class Temp {
constructor () {
this.start()
}
progress = 0
start () {
setInterval(() => {
this.progress += 1
}, 1000)
}
}
const temp = new Temp()
vue2渲染成功(页面显示1,2,3,4,5.......)
new Vue({
el: '#app',
data () {
return { temp }
},
})
但是vue3渲染无效(页面显示总是0)
Vue.createApp({
data() {
return { temp }
}
}).mount('#app')
Vue 3 创建 Proxy 对象而不是就地扩充原始对象。从概念上讲,您可以将其视为(在 vue3 代码中):
const dataObj = { temp };
const data = reactive(dataObj);
dataObj
是您的原始对象,data
是代理。 它们是两个不同的对象。重要的是 data
是反应性的,但 dataObj
不是。无法观察到 dataObj 上的所有直接突变,因为观察实用程序都在代理对象的存根方法中。
你的 Temp class 正在做什么,实际上它正在改变原始对象 - 这就是 this
所指的。
如果您的组件不拥有它的数据,即数据需要外部化和传入,并且将在外部进行管理(变异),您将需要创建一个反应对象并将其传递到您的组件中。
一个简单的演示
HTML 模板
<div id="app">{{ temp.progress }}</div>
实例化对象
class Temp {
constructor () {
this.start()
}
progress = 0
start () {
setInterval(() => {
this.progress += 1
}, 1000)
}
}
const temp = new Temp()
vue2渲染成功(页面显示1,2,3,4,5.......)
new Vue({
el: '#app',
data () {
return { temp }
},
})
但是vue3渲染无效(页面显示总是0)
Vue.createApp({
data() {
return { temp }
}
}).mount('#app')
Vue 3 创建 Proxy 对象而不是就地扩充原始对象。从概念上讲,您可以将其视为(在 vue3 代码中):
const dataObj = { temp };
const data = reactive(dataObj);
dataObj
是您的原始对象,data
是代理。 它们是两个不同的对象。重要的是 data
是反应性的,但 dataObj
不是。无法观察到 dataObj 上的所有直接突变,因为观察实用程序都在代理对象的存根方法中。
你的 Temp class 正在做什么,实际上它正在改变原始对象 - 这就是 this
所指的。
如果您的组件不拥有它的数据,即数据需要外部化和传入,并且将在外部进行管理(变异),您将需要创建一个反应对象并将其传递到您的组件中。