跳到主要内容

Vue2和Vue3响应式原理对比

Vue2响应式

vue2.x的响应式

  • 实现原理:
    • 对象类型:通过Object.defineProperty()对属性的读取、修改进行拦截(数据劫持)。
    • 数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)。比如push方法,其实是执行了两块内容,一个是调用数组的push方法,其次是响应式更新页面。
    Object.defineProperty(data, 'count', {
get () {},
set () {}
})
  • 存在问题:
    • 新增属性、删除属性, 界面不会更新。
    • 直接通过下标修改数组, 界面不会自动更新。

问题的解决是,通过this.$set()this.$delete(),可以手动添加和删除某个key的响应式监听。

Vue3响应式

    new Proxy(data, {
// 拦截读取属性值
get (target, prop) {
return Reflect.get(target, prop)
},
// 拦截设置属性值或添加新属性
set (target, prop, value) {
return Reflect.set(target, prop, value)
},
// 拦截删除属性
deleteProperty (target, prop) {
return Reflect.deleteProperty(target, prop)
}
})

proxy.name = 'tom'