Vue2 和 Vue3 的响应式实现原理有所不同。
- Vue2 响应式实现原理:
Vue2 使用 Object.defineProperty() 方法来实现数据劫持,从而实现数据的响应式更新。具体步骤如下:
- 首先,在初始化阶段,遍历 data 对象的所有属性,为每个属性创建一个对应的 watcher 对象(观察者对象)。
- 然后,通过 Object.defineProperty() 方法,将 data 对象的每个属性设置为 getter/setter,这样当 data 对象的属性发生变化时,可以通知对应的 watcher 对象进行更新。
- 最后,当 data 对象的属性发生变化时,会触发对应的 watcher 对象的 update() 方法,从而更新视图。
以下是一个简单的 Vue2 响应式实现示例:
// 引入依赖
import { observe, reactive } from 'vue'
// 定义一个响应式对象
const state = reactive({
count: 0
})
// 使用 observe() 函数,将 state 对象转换为响应式对象
observe(state)
// 监听 count 属性的变化
new Watcher(state, 'count', (newValue, oldValue) => {
console.log('count changed from', oldValue, 'to', newValue)
})
// 修改 count 属性的值
state.count++
- Vue3 响应式实现原理:
Vue3 使用 Proxy() 方法来实现数据劫持,从而实现数据的响应式更新。具体步骤如下:
- 首先,在初始化阶段,遍历 data 对象的所有属性,为每个属性创建一个对应的 effect(副作用)函数。
- 然后,通过 Proxy() 方法,将 data 对象的每个属性设置为 getter/setter,这样当 data 对象的属性发生变化时,可以通知对应的 effect 函数进行更新。
- 最后,当 data 对象的属性发生变化时,会触发对应的 effect 函数的运行,从而更新视图。
以下是一个简单的 Vue3 响应式实现示例:
// 引入依赖
import { reactive, effect } from 'vue'
// 定义一个响应式对象
const state = reactive({
count: 0
})
// 监听 count 属性的变化
effect(() => {
console.log('count changed to', state.count)
})
// 修改 count 属性的值
state.count++