vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > vue2和vue3响应式区别

vue2和vue3响应式的区别(结合代码的梳理)

作者:年纪轻轻只想中奖

响应式是Vue框架的核心特性,其本质是数据驱动视图,当数据发生变化时,视图会自动同步更新,无需手动操作DOM,这篇文章主要介绍了vue2和vue3响应式区别的相关资料,需要的朋友可以参考下

Vue 2 的Object.defineProperty的局限性

1. 无法监听属性的添加和删除

2. 无法监听数组的变化

3. 性能问题

Vue 3 的Proxy的优势

Vue 3 使用 Proxy 来实现响应式数据,解决了 Vue 2 的许多局限性:

1. 可以监听属性的添加和删除

2. 可以监听数组的变化

3. 性能更好

Vue 2 和 Vue 3 的对比

特性Vue 2 (Object.defineProperty)Vue 3 (Proxy)
监听属性的添加和删除不支持,需使用 Vue.set 和 Vue.delete支持,直接监听
监听数组的变化不支持,需重写数组方法支持,直接监听
性能初始化时需要递归遍历所有属性,性能较差惰性监听,按需收集依赖,性能更好
代码复杂度需要额外处理数组和动态属性代码更简洁,功能更强大

结合代码的梳理

Vue 2 的实现(基于 Object.defineProperty)

function observe(obj) {
    for (const key in obj) {
        let internalValue = obj[key];
        let fns = new Set();

        // 递归监听嵌套对象
        if (typeof internalValue === 'object' && internalValue !== null) {
            observe(internalValue);
        }

        Object.defineProperty(obj, key, {
            get() {
                if (activeFunc) {
                    fns.add(activeFunc);
                }
                return internalValue;
            },
            set(val) {
                internalValue = val;
                // 递归监听新值
                if (typeof val === 'object' && val !== null) {
                    observe(val);
                }
                fns.forEach(fn => fn());
            }
        });
    }
}

Vue 3 的实现(基于 Proxy)

function reactive(obj) {
    return new Proxy(obj, {
        get(target, key, receiver) {
            const dep = getDep(target, key);
            dep.depend(); // 依赖收集
            const result = Reflect.get(target, key, receiver);
            // 递归监听嵌套对象
            if (typeof result === 'object' && result !== null) {
                return reactive(result);
            }
            return result;
        },
        set(target, key, value, receiver) {
            const dep = getDep(target, key);
            const result = Reflect.set(target, key, value, receiver);
            dep.notify(); // 派发更新
            return result;
        },
        deleteProperty(target, key) {
            const dep = getDep(target, key);
            const result = Reflect.deleteProperty(target, key);
            dep.notify(); // 派发更新
            return result;
        }
    });
}

总结

到此这篇关于vue2和vue3响应式区别的文章就介绍到这了,更多相关vue2和vue3响应式区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文