vue3数据响应式的理解
- Vue2使用
defineProperty
- Vue3使用
Proxy
Vue2中的响应式
Vue2中,对一个数据进行响应式处理是通过Object.defineProperty()
进行递归处理,在效率上是比较慢的。而且,在Vue生命周期中,响应式处理是在beforeCreated
和created
函数之间,这也造成了后续想要新增/删除某个对象的响应式属性时,就必须调用Vue.$set
方法手动触发响应式处理。
Vue3中的响应式
Vue3中,由于使用了ES6中的Proxy
,也就不需要对数据进行递归处理。
let proxy = new Proxy(data, {
get: function() {},
set: function() {},
})
proxy.something
当使用proxy
中的某个值时,才会调用Proxy
中的set/get
方法,避免了无意义的处理,也不用Vue.$set
方法(在Vue3中也删除了$set
方法)。Proxy
本身的效率就比defineProperty
高。
Vue3中为什么不用构造函数
new Vue({}).$mount('#app1')
new Vue({}).$mount('#app2')
在上述代码中,在同一个页面中具有两个Vue应用,看似是没有任何问题。但是如果我们想要全局注入mixins、注册components时
Vue.component(SomeThing)
Vue.mixins()
则会把多个Vue应用都会应用到。
但是在Vue3中,用createApp来创建Vue应用,则不会出现这种情况。
createApp(root).use().mount('#app1')
createApp(root).use().mount('#app2')
不过一般情况也不会出现一个页面多个Vue应用的情况。