vue3.0 reactive和shallowReact响应式源码实现

shallowReact:
	因为只实现第一层,所以直接new Proxy代理即可
	
reactive:
	因为要实现深层次数据劫持,所以需要递归
		递归注意情况:
			当是普通值时,因为普通值所处的对象已经被Proxy代理,所以无需设置直接返回,
			如果是数组:需要遍历出数组中的对象,使其变成响应式的
			如果是对象:需要遍历出属性中的对象,使其变成响应式的

效果图:
在这里插入图片描述
在这里插入图片描述

代码示例:


//定义处理器
const reactiveHandler = {
  get(target,property) {
    console.log('读取了'+property+"属性")
    const result = Reflect.get(target, property);

    return result;
  },
  set(target, property, value) {
    console.log('设置了'+property+'属性')
    const result = Reflect.set(target, property, value);
    return result;
  },
  deleteProperty(target, property) {
    console.log('删除了' + property + "属性");
    const res = Reflect.deleteProperty(target, property);
    return res;
  }
}



function shallowReactive(target) {
  //判断目标对象类型
  if (target && typeof target === "object") {
    return new Proxy(target,reactiveHandler)
  }
  //基本类型直接返回
  return target
}



const shallow = shallowReactive({ a: 'jeff',b:{c:'tom'} });

delete shallow.a

function reactive(target) {
  //判断目标对象类型
  if (target && typeof target === "object") {
    if (Array.isArray(target)) { //数组情况
      target.forEach((item, index) => { //遍历数组,当数组元素是对象情况
        target[index] = reactive(item); //递归元素
      })
    } else { //对象情况
      Object.keys(target).forEach((key) => {//遍历对象,当对象属性中还有对象
        target[key] = reactive(target[key]); //递归元素
      })
    }

    return new Proxy(target, reactiveHandler);
  }
  //基本类型直接返回,因为基本类型已被其所处对象代理
  return target;
}

const deep = reactive({ a: 1, b: { c: 2 } });

deep.a++;
deep.b.c++;
delete deep.b.c

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值