【Vue源码】Vue3 reactive 理解

📝 学习记录 未完成

在前辈的建议下先去看了这部分,不算是深入理解,第一次看Vue的源码,很多语句看不明白就略过了,只能是勉勉强强手写一个简单的实现。

1.学习Vue3时知道Vue2和Vue3的一大区别在于使用Proxy代替defineproperty。

2.前段时间看了 ES6的Proxy和Reflect,刚好可以帮助自己消化这部分内容。

3.另外最近学了ts,源码中的语法也可以帮助自己巩固这部分内容。

一开始上手看源码,简直是天书一样的存在,头大。就开始从易到难的盘,然后再返回去看源码。最后抱着能懂多少懂多少的态度,别的细节只能有时间再看了。

 源码地址:https://github.com/vuejs/core/blob/main/packages/reactivity/src/reactive.ts

实现分两步:拦截和监听

 👇 核心原理:

// objectList 避免对象重复proxy
let objectList = new WeakMap();
// proxyList 避免proxy对象再次被proxy
let proxyList = new WeakMap();

function reactive(target) {
  let proxy = objectList.get(target);
  // 如果target存在proxy,直接返回proxy
  if (proxy) {
    return proxy;
  }
  // 如果target是proxy,直接返回target
  if (proxyList.has(target)) {
    return target;
  }
  // 如果target是基本类型,直接返回target
  if (!isObject(target)) {
    return target
  }

  proxy = new proxy(target, handle);
  objectList.set(target, proxy);
  proxyList.set(proxy, target);

  return proxy;
}

const handle = {
  get,
  set,
  deleteProperty
};

function get(target, propKey, receiver) {
  console.log('get')
  let proxy = Reflect.get(target, propKey, receiver);
  track(target, 'get', propKey)
  return isObject(proxy) ? reactive(proxy) : proxy;
  //实现多层代理,若为对象,需要递归
}

function isObject(val) {
  return typeof val === 'object' && val !== null;
}

另外就是监听,这一部分代码的实现就比较巧妙了。看懂了,但没完全懂。有时间再细细琢磨吧。

源码阅读辅助资料:深入源码理解Vue3 reactive - 简书

手撕reactive理解底层原理:vue3源码学习——响应式reactive_潇蓝诺依的博客-CSDN博客

👩‍🌾 有时间再看这部分的时候来补充,先去学习优先级高的东西~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值