Vue3 的Proxy

Vue3 升级内容

  • 全部使用ts重写(响应式、vdom、模板编译)
  • 性能提升,代码量减少(打包出来的内容代码量少)
  • 会调整部分API

 

Object.defineProperty的缺点

  • 深度监听需要一次性递归
  • 无法监听新增属性/删除属性 (Vue.set Vue.delete)
  • 无法原生监听数组,需要特殊处理

 

Proxy基本应用

截屏2020-10-22 下午4.54.10.png

 

截屏2020-10-22 下午5.12.19.png

Reflect作用

和 Proxy 能力 一一对应

规范化、标准化、函数式

代替Object上的工具函数

截屏2020-10-22 下午5.15.14.png

 

proxy完成响应式

function reactive(target = {}) {
  // 不是对象、数组直接返回
  if(typeof target !== 'object' || target == null) {
    return target
  }
  
  const proxyConfig = {
    get(target, key, receiver){
      const ownKeys = Reflect.ownKeys(target)
      if (ownKeys.includes(key)) {
        console.log('get', key)
      }
      const result = Reflect.get(target, key, receiver)
      /* 深度监听修改1
        return result
        
      */
      /*
        性能提升:在get时去递归,去深度监听
        而 defineProperty 是开始时就递归完成
      */
      return reactive(result)
      
    },
    set(target, key, val, receiver){
      if(val === target[key]){return true}
      
      /* 可监听到新增的key */
      const ownKeys = Reflect.ownKeys(target)
      if(ownKeys.includes(key)){
        // 已有的可以
      }else{
        // 新增的key
        console.log('新增的key')
      }
      
      const result = Reflect.set(target, key, val, receiver)
      console.log('set', key, val)
      return result
    },
    deleteProperty(target, key){
      const result = Relect.deleteProperty(target, key)
      console.log('delete property', key)
      return result
    }
  }
  
  // 生成代理对象
  const observed = new Proxy(target, proxyConfig)
  return observed
}

// 测试数据
const data = {
  name: 'zwx',
  age: '25',
  info: {
    city: 'beijing',
    a: {
      b: {
        c: 1
      }
    }
  }
}

// 
let newdata = reactive(data)
newdata.info.city // get info 不是 get city
newdata.info.a // b 和之后还没加入响应式

newdata.info.a.b.zzz = 88

深度监听,性能更好

可监听 新增/删除属性

可监听数组变化

 

proxy能规避defineProperty缺点

proxy无法兼容全部浏览器,无法polyfill

 

关注作者和知识库后续更新

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值