Vue3源码解读

102 阅读1分钟

一、vue响应式原理

实现原理definePropertyProxyvalue setter
实际场景vue2 响应式vue3 reactivevue3 ref
优势兼容性基于Proxy实现真正的拦截实现简单
劣势数组和属性删除等拦截不了兼容不了IE11只拦截value属性
实际应用vue2vue3 复杂数据vue3 简单数据

二、reactive和ref

Vue 3 的 reactive 函数可以把一个对象变成响应式数据,而 reactive 就是基于 Proxy 实现的。

但是在 Vue 3 中还有另一个响应式实现的逻辑,就是利用对象的 get 和 set 函数来进行监听,这种响应式的实现方式,只能拦截某一个属性的修改,这也是 Vue 3 中 ref 这个 API 的实现。

三、vue3和vue2响应式原理的区别

vue2响应式原理

let data = {
    msg: 'hello'
}

let vm = {}

proxyData(data)

function proxyData(data) {
    Object.keys(data).forEach(key => {
        Object.defineProperty(vm, key, {
            enumerable: true,
            configurable: true,
            get() {
                return data[key]
            },
            set(newValue) {
                if(newValue === data[key]) {
                    return
                }
                data[key] = newValue
                document.querySelector('#app').textContent = data[key]
            }
        })
    }
}

vue3响应式原理

let data = {
    msg: 'hello'
}

let vm = new Proxy(data, {
    get(target, key) {
        return target[key]
    },
    set(target, key, newValue) {
        if(target[key] === newValue) {
            return
        }
        target[key] = newValue
        document.querySelector('#app').textContent = target[key]
    }
})