[学习笔记]Vue2和Vue3响应式原理区别

1.Vue2的响应式原理:

通过Object.defineProperty()对数据进行劫持,调用set&&get方法操作数据后返回,当读取对象中属性时会调用get方法,修改调用set方法,缺点:无法观测到删除数据和新增数据的变化,官方也给了解决方案:this.$Set()或者this.$forceUpdate()强制更新dom

Vue2响应式的简易实现:

      //源数据
      let person = {
        name: "zhangsan",
        age: 18,
        height: 188,
      };

      //vue2的响应式
      let p = {};

      for (let key in person) {
        Object.defineProperty(p, key, {
          get() {
            console.log(`读取了${key}属性`);
            return person.key;
          },
          set(value) {
            console.log(`修改了${key}属性,更新页面`);
            person.key = value;
          },
        });
      }

2.Vue3的响应式原理:

        1.通过Proxy代理拦截对象中任意属性的变化, 包括:属性值的读写、属性的添加、属性的删除等。

        2.通过Reflect(反射): 对源对象的属性进行操作

Reflect其中某些方法与Object相同,如defineProperty()等,Reflect让Object操作都变成函数行为

Vue3的基本实现:

      let person = {
        name: "zhangsan",
        age: 18,
        height: 188,
      };    
       
        const p = new Proxy(person,{
        set(target,propName,value){
            console.log(`设置${propName}值为${value}`)
            // target[propName] = value

            Reflect.set(target,propName,value)
        },
        //target:原数据  propName:参数名
        get(target,propName){
            console.log(`读取${propName}属性`)
            // return target[propName]
            return Reflect.get(target,propName)
        },
        //property 待删除的属性名
        deleteProperty(target,property){
            console.log(`删除${property}属性`)
            // return delete target[property]
            return Reflect.deleteProperty(target,property)
        }
    })

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值