返回

Vue 响应式原理,纵览 Vue 2 和 Vue 3 的奥秘

前端

Vue 的响应式原理概述

Vue 的响应式原理,是通过追踪数据的变化,当数据变化时,自动触发组件的重新渲染。在 Vue 2 中,响应式原理是通过 Object.defineProperty() 方法来实现的,在 Vue 3 中,则使用 Proxy 来实现。

Vue 2 的响应式原理

在 Vue 2 中,响应式原理是通过 Object.defineProperty() 方法来实现的。Object.defineProperty() 方法允许我们在对象上定义属性,并指定属性的特性。其中,我们可以使用 getter 和 setter 来追踪属性的变化。

const obj = {}
Object.defineProperty(obj, 'foo', {
  get() {
    // 当读取属性时触发
    console.log('get foo')
    return this.value
  },
  set(newValue) {
    // 当设置属性时触发
    console.log('set foo')
    this.value = newValue
  }
})

当我们访问 obj.foo 时,就会触发 getter 函数,当我们修改 obj.foo 时,就会触发 setter 函数。

在 Vue 2 中,每个组件都有一个响应式对象,这个响应式对象包含了组件的状态数据。当组件的状态数据发生变化时,Vue 会自动触发组件的重新渲染。

Vue 3 的响应式原理

在 Vue 3 中,响应式原理是通过 Proxy 来实现的。Proxy 是 ES6 中引入的一个新特性,它允许我们创建一个代理对象,这个代理对象可以拦截对对象的访问和修改操作。

const obj = new Proxy({}, {
  get(target, property) {
    // 当读取属性时触发
    console.log('get', property)
    return target[property]
  },
  set(target, property, value) {
    // 当设置属性时触发
    console.log('set', property, value)
    target[property] = value
  }
})

当我们访问 obj.foo 时,就会触发 getter 函数,当我们修改 obj.foo 时,就会触发 setter 函数。

在 Vue 3 中,每个组件都有一个响应式对象,这个响应式对象包含了组件的状态数据。当组件的状态数据发生变化时,Vue 会自动触发组件的重新渲染。

Vue 2 和 Vue 3 的响应式原理对比

特性 Vue 2 Vue 3
实现方式 Object.defineProperty() Proxy
性能 较慢 较快
内存消耗 较高 较低
兼容性 IE9+ IE11+

总结

Vue 2 和 Vue 3 的响应式原理都是通过追踪数据的变化,当数据变化时,自动触发组件的重新渲染。在 Vue 2 中,响应式原理是通过 Object.defineProperty() 方法来实现的,在 Vue 3 中,则使用 Proxy 来实现。Proxy 的性能更好,内存消耗更低,但兼容性不如 Object.defineProperty()。