proxy和defineProperty区别

文章讨论了在Vue框架中,数据响应性从vue2的defineProperty数据劫持到vue3的proxy代理的转变。mutable和immutable的概念被引入,解释了可变和不可变数据类型的优缺点。在vue2中,新增对象属性需用$set确保更新,而在vue3中,proxy能自动响应包括新增属性在内的所有变化。
摘要由CSDN通过智能技术生成

一 mutable概念

        在这之前,首先我们解下mutable

        mutable表示为可变类型的对象。提供了可以改变其内部数据值的操作,其内部的值可以被重新更改。

        vue以可变数据源为核心的理念,来实现整个UI变动更新

mutable(可变类型)immutable(不可变类型)
优点减少数据拷贝次数,效率更高内部数据不可变导致更安全,可以用作多线程的共享对象,不必考虑同步问题
缺点内部数据可变,导致风险更大内部数据不可变,频繁的修改会产生大量临时拷贝浪费空间

        用最简单的讲法就是:初始化数据生成了页面,直接修改源数据触发更新,页面重新渲染

二 defineProperty

        在使用vue2的时候,我们经常会碰到一个问题,添加新的对象属性obj.a = 1会无法被vue2劫持,必须使用vue2提供的$set方法来进行更新。

         因为当我们给a对象新增一个属性的时候,虽然在对应的对象上成功的生成一个新的属性,但是vue2是通过defineProperty的setter与getter进行数据劫持的,新增的数据并没有被劫持,所以无论怎么更新,页面依旧不会重新渲染

        (这个的原因是defineProperty只能对当前对象的其中一个属性进行劫持)

const a = {
    b: 1,
};
Object.defineProperty(a, 'b', {
    set: function() {},
    get: function() {},
});

三 proxy

        在vue3中,使用proxy来进行数据代理就完全没有这个顾虑

        proxy对于数据的代理,能够响应新增的属性,当新增一个属性的时候,可以响应到get中,对当前对象进行代理

const p = new Proxy({
    a: 1,
    b: 2,
}, {
    get: function(obj, value) {
        console.log('get', obj, value);
        return Reflect.get(obj, value);
    },
    set: function(obj, prop, value) {
        console.log('set', obj, prop, value);
        return Reflect.set(obj, prop, value);
    },
})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值