用Proxy给reactive套个娃会怎么样?

简介: 既然reactive是使用Proxy实现的,而且也可以套娃,那么我们自己定义一个Proxy套一下reactive会怎么样呢?

既然reactive是使用Proxy实现的,而且也可以套娃,那么我们自己定义一个Proxy套一下reactive会怎么样呢?


先不用管有没有意义,套上再说,于是有了这样的代码。


/**
   * 用Proxy定义一个 reactive 的套娃。
   * @param {*} _target  要拦截的目标
   * @param {*} callback 属性变化后的回调函数
   */
  const myReactive = (_target, callback) => {
    const proxy = new Proxy(_target, {
      get: function (target, key, receiver) {
        if (typeof key !== 'symbol') { // 别问我为啥要加这个,因为不加会报错。
          console.log(`getting ${key}!`, target[key])
        } else {
          console.log('getting symbol:', key, target[key])
        }
        // 调用原型方法
        return Reflect.get(target, key, receiver)
      },
      set: function (target, key, value, receiver) {
        console.log(`setting ${key}:${value}!`)
        // 调用原型方法
        return Reflect.set(target, key, value, target) // 写 receiver 的话,模板不会自动更新
      }
    })
    // 返回实例
    return proxy
  }
复制代码


按照网上介绍,写了这个Proxy的函数,然后满心欢喜的套上了reactive,然后绑定模板设置更新按钮。


结果更新后p反映没有。


不对呀,不是把操作交给reactive了,没有理由不刷新模板呀。


卡了好几天,后来发现自己真笨,不会设置断点跟踪一下吗?整段的源码看不懂,看个set跟踪还不懂吗?


跟了几次终于看明白了,原来set里面做了一个 target 和 receiver 的对比判断,结果就跳过去了。


于是我把 receiver 改成 target 看他还跳不跳。


结果终于刷新模板了。


好吧,套个娃确实没啥实际用处,只是一顿折腾后,对于Vue是如何实现响应性,以及如何刷新模板的有了更深一点点的了解。


另外,这个不支持子子属性的拦截。只能拦截一层属性,如果要深入拦截,还要做个递归,对每个嵌套对象都设置个Proxy才行。等等,reactive好像不是这么实现的。。。


这是模板调用的监听结果:


getting __v_isRef! undefined
getting toJSON! undefined
getting symbol: Symbol(Symbol.toStringTag) undefined
getting symbol: Symbol(Symbol.toStringTag) undefined
getting symbol: Symbol(Symbol.toStringTag) undefined
getting name! jyk
getting age! 18


相关文章
|
JavaScript
Vue3 中 proxy 的不同
Vue3 中 proxy 的不同
|
1月前
|
JavaScript 前端开发 开发者
Vue 3中的Proxy
【10月更文挑战第23天】Vue 3中的`Proxy`为响应式系统带来了更强大、更灵活的功能,解决了Vue 2中响应式系统的一些局限性,同时在性能方面也有一定的提升,为开发者提供了更好的开发体验和性能保障。
75 7
|
2月前
|
JavaScript 前端开发 UED
为什么在 Vue3.0 采用了 Proxy,抛弃了 Object.defineProperty
Vue 3.0 采用 Proxy 替代 Object.defineProperty,主要因为 Proxy 提供了更全面、高效的数据拦截能力,支持对更多操作进行拦截和自定义处理,同时减少了对对象的限制,提升了框架性能和开发体验。
|
3月前
|
前端开发
react配置proxy代理的两种方式
本文介绍了在React项目中配置代理的两种方式:通过在package.json中添加代理配置,以及通过创建setupProxy.js文件来实现更复杂的代理规则。
138 2
|
4月前
|
缓存 JavaScript 安全
浅谈 Vue 3 的 Proxy 代理为什么使用了 Reflect
浅谈 Vue 3 的 Proxy 代理为什么使用了 Reflect
|
7月前
|
JavaScript
vue配置代理proxy
vue配置代理proxy
64 0
|
7月前
|
JavaScript 小程序 前端开发
Vue3和Mobx5都使用Proxy了,你更应该了解Proxy
Vue3和Mobx5都使用Proxy了,你更应该了解Proxy
|
安全 API
Vue3 proxy 解决跨域
jsonp 这种方式在之前很常见,他实现的基本原理是利用了HTML里script元素标签没有跨域限制 动态创建script标签,将src作为服务器地址,服务器返回一个callback接受返回的参数
471 0
Vue3 proxy 解决跨域
|
7月前
|
监控 JavaScript 前端开发
Vue3的proxy
Vue3的proxy
55 0
|
7月前
|
前端开发 API
React配置代理(proxy)
React配置代理(proxy)