Vue3.x的数据代理

先来说简单的吧

Vue 3.x 的数据绑定是通过事件代理 proxy 事件代理的形式
同时 proxy 可以接收两个参数,一个是 target(代理数据),一个是 handler
handler 里面提供了诸多方法,其中在这里使用的只有三个(get(), set(), deleteProperty())
handler 诸多方法中,又有对应的静态方法,就是允许执行

shallowReactive(浅的拷贝)
function shallowReactive(target) {
  if (target && typeof target === 'object') return new Proxy(target, reactiveHandler)

  return target
}
reactive(深的拷贝)
function reactive(target) {
  if (target && typeof target === 'object') {
    if (Array.isArray(target)) {
      target.forEach((_, i) => {
        target[i] = reactive(_)
      })
    } else {
      Object.keys(target).forEach((_) => {
        target[_] = reactive(target[_])
      })
    }
    return new Proxy(target, reactiveHandler)
  }

  return target
}
handler
const reactiveHandler = {
  get(target, property, receiver) {
    console.log('拦截到了读取', target, property, receiver)
    return Reflect.get(target, property, receiver)
  },
  set(target, property, receiver) {
    console.log('拦截到了修改/新增', target, property, receiver)
    return Reflect.set(target, property, receiver)
  },
  deleteProperty(target, property) {
    console.log('拦截到了删除', target, property)
    return Reflect.deleteProperty(target, property)
  }
}
测试数据
    const user = shallowReactive({
      name: '哈哈哈',
      age: 20,
      likes: ['吃饭', '睡觉', '打豆豆'],
      obj: {
        name: '嘻嘻嘻',
      },
    })
	// user.name += 'aaa'
	// user.car = '奔驰'
	// delete user.age
	// console.log(user)

shallowReactive的数据

    const user = shallowReactive({
      name: '哈哈哈',
      age: 20,
      likes: ['吃饭', '睡觉', '打豆豆'],
      obj: {
        name: '嘻嘻嘻',
      },
    })
    // ...操作
    console.log(user2)

shallowReactive的数据

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值