vue3 reactive响应式实现源码

news2024/11/26 12:20:32

Vue 3 的 reactive 是基于 JavaScript 的 Proxy 实现的,因此它通过代理机制来拦截对象的操作,从而实现响应式数据的追踪。下面是 Vue 3 的 reactive 源码简化版。

Vue 3 reactive 源码简化版

首先,我们需要了解 reactive 是如何工作的,核心的功能是使用 Proxy 来代理对象并处理对象的读取和修改。

// reactive.js
export function reactive(target) {
  // 检查 target 是否是对象
  if (typeof target !== 'object' || target === null) {
    return target;
  }

  // 使用 Proxy 来代理对象的读取和设置操作
  return new Proxy(target, {
    get(target, prop, receiver) {
      // 当访问对象的属性时,执行 getter
      // 可以在此处添加追踪操作,比如收集依赖
      console.log(`Getting ${String(prop)}:`, target[prop]);
      return target[prop];
    },

    set(target, prop, value, receiver) {
      // 当设置对象的属性时,执行 setter
      // 可以在此处添加更新操作,比如通知视图更新
      console.log(`Setting ${String(prop)} to:`, value);
      target[prop] = value;
      
      // 返回 true 表示修改成功
      return true;
    }
  });
}

关键点解释

  • ProxyProxy 是 JavaScript 的一项新特性,它允许我们定义自定义的行为来拦截对象的基本操作(如读取、写入、删除等)。在 reactive 的实现中,Proxy 拦截了对象的 getset 操作。

  • get:当访问对象的某个属性时,会触发 get 方法。在 get 方法中,我们通常会做两件事:

    • 追踪依赖:在 Vue 中,通常会使用依赖收集来追踪视图中对数据的引用。
    • 返回属性值:最终返回目标对象的属性值。
  • set:当设置对象的某个属性时,会触发 set 方法。在 set 方法中,我们通常会做以下几件事:

    • 修改目标对象的属性值。
    • 通知视图或其他相关部分进行更新。

完整实现(简化版)

下面是一个简化版的 Vue 3 reactive 源码,它展示了如何通过 Proxy 来实现响应式。

// reactive.js
function reactive(target) {
  if (typeof target !== 'object' || target === null) {
    return target;
  }

  const handler = {
    get(target, prop, receiver) {
      // 在这里,通常会收集依赖项
      // 例如,Vue 通过某种方式追踪当前访问的属性
      console.log(`Getting ${String(prop)}:`, target[prop]);
      return target[prop];
    },

    set(target, prop, value, receiver) {
      // 在这里,可以触发视图更新的机制
      console.log(`Setting ${String(prop)} to:`, value);
      target[prop] = value;
      
      // 返回 true,表示操作成功
      return true;
    }
  };

  return new Proxy(target, handler);
}

// 使用例子
const state = reactive({
  count: 0,
  user: { name: 'John' }
});

state.count = 1;  // 输出: Setting count to: 1
console.log(state.count);  // 输出: Getting count: 1

Vue 3 实现中的关键点

在 Vue 3 中,reactive 会结合 Vue 的内部系统来做更复杂的事情,比如:

  1. 依赖收集:当属性被读取时,Vue 会通过 get 拦截器收集依赖。这意味着,只有当属性真正被访问时,相关组件才会注册为该属性的依赖。

  2. 视图更新:当数据发生变化时,set 方法会触发视图更新,通常是通过通知渲染函数重新执行来实现的。

  3. 嵌套对象的响应式:当你访问一个对象的属性时,Vue 会递归地将嵌套对象也变成响应式对象。

完整版源码(源码中包含 Vue 的依赖管理和优化)

如果你想查看 Vue 3 reactive 和其他响应式 API(如 ref)的完整实现,可以参考 Vue 3 的源码库,具体代码位于 packages/reactivity 文件夹下。

你可以从 Vue 3 GitHub 仓库 下载完整的源码。

具体的 reactive 实现代码会涉及更多的优化和功能,比如依赖追踪、缓存、代理标识符等复杂逻辑,建议直接查看 Vue 3 的源码进行深入学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2247837.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CVE-2022-26201

打开是这么个页面 左上角找到Admin访问 里面有个Add Users&#xff0c;访问一下&#xff0c;能创建用户&#xff0c;有个能上传图片的地方 普通的一句话木马无法访问flag&#xff0c;需要创建一个权限马 <?php system($_GET[1]);phpinfo();?> 因为只能上传jpg形式的文…

使用 OpenCV 进行视频中的行人检测

在计算机视觉领域&#xff0c;行人检测是一个重要的研究方向&#xff0c;它在视频监控、自动驾驶、人机交互等领域都有着广泛的应用。本文将介绍如何使用 OpenCV 库来实现视频中的行人检测。 环境准备 首先&#xff0c;我们需要安装 OpenCV 库。可以通过以下命令来安装&#…

【K8s】专题十五(4):Kubernetes 网络之 Calico 插件安装、切换网络模式、卸载

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】&#xff08;全…

鸿蒙面试题-某迈-2024年11月22日

某迈-2024年11月22日 1. 自我介绍 2. 鸿蒙中地图功能如何实现&#xff0c;申请流程是什么样的 主要通过 集成 Map Kit 的功能来实现Map Kit 功能很强大&#xff0c;比如有 创建地图&#xff1a;呈现内容包括建筑、道路、水系等。地图交互&#xff1a;控制地图的交互手势和交…

微软要求 Windows Insider 用户试用备受争议的召回功能

拥有搭载 Qualcomm Snapdragon 处理器的 Copilot PC 的 Windows Insider 计划参与者现在可以试用 Recall&#xff0c;这是一项臭名昭著的快照拍摄 AI 功能&#xff0c;在今年早些时候推出时受到了很多批评。 Windows 营销高级总监 Melissa Grant 上周表示&#xff1a;“我们听…

【Android】静态广播接收不到问题分析思路

参考资料&#xff1a; Android 静态广播注册流程(广播2)-CSDN博客 Android广播发送流程(广播3)_android 发送广播-CSDN博客 https://zhuanlan.zhihu.com/p/347227068 在Android中&#xff0c;静态广播如果静态广播不能接收&#xff0c;我们可以从整个流程中去分析&#xff…

非递归遍历二叉树(数据结构)

我的博客主页 非递归遍历二叉树 前序遍历&#xff08;迭代&#xff09;中序遍历&#xff08;迭代&#xff09;后续遍历&#xff08;迭代&#xff09; 二叉树的遍历方式有&#xff1a;前序遍历、中序遍历、后续遍历&#xff0c;层序遍历&#xff0c;而树的大部分情况下都是通过递…

2024 java大厂面试复习总结(一)(持续更新)

10年java程序员&#xff0c;2024年正好35岁&#xff0c;2024年11月公司裁员&#xff0c;记录自己找工作时候复习的一些要点。 java基础 hashCode()与equals()的相关规定 如果两个对象相等&#xff0c;则hashcode一定也是相同的两个对象相等&#xff0c;对两个对象分别调用eq…

【可变参数,lambda,function,bind】

可变参数 Args模板参数包 解析参数包&#xff0c;使用递归和再来一个参数包。参数包传参时&#xff0c;会把第一个数据给前面的&#xff0c;剩下的数据全部传给后面的参数包&#xff0c;参数包就一直变小。 lambda表达式 书写格式&#xff1a;[capture-list] (parameters)…

ArcGIS API for Javascript学习

一、ArcGIS API for Javascript 介绍 ArcGIS API for Javascript 是由美国 Esri 公司推出&#xff0c;跟随ArcGIS 9.3 同时发布的&#xff0c;是Esri 基于dojo 框架和 REST 风格实现的一套编程接口。通过 ArcGIS API for Javascript可以对ArcGIS for Server 进行访问&#xff…

JavaScript的let、var、const

这张图片主要介绍了JavaScript中的三种变量声明方式&#xff1a;let、var和const。 1. let 含义&#xff1a;let是现在实际开发中常用的变量声明方式。特点&#xff1a; 块级作用域&#xff1a;let声明的变量只在其所在的块级作用域内有效。例如&#xff1a;{let x 10; } co…

24.11.25 Mybatis1

1.Mybatis介绍 1.封装JDBC 减少重复性代码 2.ORM(实体关系映射框架) 通过框架 实体类 <--> 数据表 自动封装对象 3.半自动的ORM框架 还需要写sql语句 2.使用mybatis连接数据库(调通一遍 记住需要哪些文件) 1.创建全局配置文件 mybatis-config.xml <?xml ver…

【Python爬虫五十个小案例】爬取猫眼电影Top100

博客主页&#xff1a;小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介&#xff1a;分享五十个Python爬虫小案例 &#x1f40d;引言 猫眼电影是国内知名的电影票务与资讯平台&#xff0c;其中Top100榜单是影迷和电影产业观察者关注的重点。通过爬取猫眼电影Top10…

Oh-My-ZSH安装教程

1. 安装zsh sudo apt-get install zsh2.安装on-my-zsh wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh上面方式很大可能因为网络连接问题而失败&#xff0c;可以通过以下方式&#xff1a; git clone gitgithub.com:ohmyzsh/ohmyzsh…

三六零[601360]行情数据接口

1、三六零&#xff1a;实时行情 Restful API # 测试接口&#xff1a;可以复制到浏览器打开 https://tsanghi.com/api/fin/stock/XSHG/realtime?tokendemo&ticker601360获取股票实时行情&#xff08;开、高、低、收、量&#xff09;。 请求方式&#xff1a;GET。 Python示例…

用 OceanBase 4.3.3,搭建《黑神话:悟空》的专属游戏AI助手

本文分享了如何基于 OceanBase 4.3.3 bp1 社区版的向量检索能力&#xff0c;通过几条简单的命令&#xff0c;快速搭建一个定制化的专属游戏助手的过程。 背景 在 OceanBase 最新推出 V 4.3.3 免费试用的同时&#xff0c;也同时发布了几个基于OB Cloud 的向量能力&#xff0c;搭…

tableau练习-制作30个图表

一、导入数据 1、导入数据 -添加-添加连接-到文件-excel格式用第一个excel导入&#xff0c;csv格式用第二个文本格式导入 2、连接数据 -从旁边这里直接拖到中间 标头连接 -日期若不一致需调节日期格式 3、保存数据 点击数据提取-再保存数据&#xff0c;保存为twbx格式 二、设计…

QT QHorizontalSpacer控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizontalSpacer)、…

第六届智能控制、测量与信号处理国际学术会议 (ICMSP 2024)

重要信息 2024年11月29日-12月1日 中国陕西西安石油大学雁塔校区 大会官网&#xff1a;www.icmsp.net 大会简介 第六届智能控制、测量与信号处理国际学术会议&#xff08;ICMSP 2024&#xff09;由西安石油大学、中海油田服务股份有限公司、浙江水利水电学院与中国石油装备…

Qt中2D绘制系统

目录 一、Qt绘制系统 1.1Qt绘制基本概念 1.2 绘制代码举例 1.3画家 1.3.1 QPainter的工作原理&#xff1a; 1.3.2 自定义绘制饼状图&#xff1a; 1.4画笔和画刷 1.4.1画笔 1.4.2 画刷填充样式 1.5 反走样和渐变 1.6绘制设备 1.7坐标变换 1.8QPainterPath 1.9绘制文…