Vue3响应式原理深度剖析:打造高性能状态管理架构
一、技术演进
Vue3响应式系统性能提升200%,内存占用减少40%
// Vue2 defineProperty
Object.defineProperty(obj, key, { get, set })
// Vue3 Proxy
new Proxy(obj, { get, set })
二、核心原理
1. 响应式基础实现
function reactive(obj) {
return new Proxy(obj, {
get(target, key, receiver) {
track(target, key) // 依赖收集
return Reflect.get(target, key, receiver)
},
set(target, key, value, receiver) {
Reflect.set(target, key, value, receiver)
trigger(target, key) // 触发更新
return true
}
})
}
2. 依赖收集系统
let activeEffect
const targetMap = new WeakMap()
function track(target, key) {
if (!activeEffect) return
let depsMap = targetMap.get(target)
if (!depsMap) {
targetMap.set(target, (depsMap = new Map()))
}
let dep = depsMap.get(key)
if (!dep) {
depsMap.set(key, (dep = new Set()))
}
dep.add(activeEffect)
}
function trigger(target, key) {
const depsMap = targetMap.get(target)
if (!depsMap) return
const effects = depsMap.get(key)
effects && effects.forEach(effect => effect())
}
三、高级应用
1. 性能优化技巧
// 1. 浅层响应式
const shallowReactive = (obj) => new Proxy(obj, {
get(target, key) {
track(target, key)
const res = target[key]
return typeof res === 'object' ? res : reactive(res)
}
// ...set
})
// 2. 只读代理
function readonly(obj) {
return new Proxy(obj, {
get(target, key) {
return Reflect.get(target, key)
},
set() {
console.warn('只读对象不可修改')
return true
}
})
}
2. 自定义ref实现
function customRef(factory) {
let value
const { get, set } = factory(
() => {
track(self, 'value')
return value
},
(newVal) => {
value = newVal
trigger(self, 'value')
}
)
const self = {
get value() { return get() },
set value(v) { set(v) }
}
return self
}
// 使用示例
const debouncedRef = customRef((track, trigger) => {
let timer
return {
get() {
track()
return value
},
set(newVal) {
clearTimeout(timer)
timer = setTimeout(() => {
value = newVal
trigger()
}, 500)
}
}
})
四、完整案例
简易状态管理系统
class Store {
constructor(state) {
this._state = reactive(state)
this._mutations = {}
this._actions = {}
}
get state() {
return readonly(this._state)
}
commit(type, payload) {
this._mutations[type]?.(this._state, payload)
}
dispatch(type, payload) {
return this._actions[type]?.(this, payload)
}
mutation(type, handler) {
this._mutations[type] = handler
}
action(type, handler) {
this._actions[type] = handler
}
}
// 使用示例
const store = new Store({ count: 0 })
store.mutation('increment', (state) => state.count++)
store.action('asyncIncrement', ({ commit }) => {
setTimeout(() => commit('increment'), 1000)
})
function checkVueVersion() {
alert(‘请确保使用Vue3.0+版本运行示例代码’);
}