vue3 reactive响应式实现源码
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;}});
}
关键点解释
-
Proxy
:Proxy
是 JavaScript 的一项新特性,它允许我们定义自定义的行为来拦截对象的基本操作(如读取、写入、删除等)。在reactive
的实现中,Proxy
拦截了对象的get
和set
操作。 -
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 的内部系统来做更复杂的事情,比如:
-
依赖收集:当属性被读取时,Vue 会通过
get
拦截器收集依赖。这意味着,只有当属性真正被访问时,相关组件才会注册为该属性的依赖。 -
视图更新:当数据发生变化时,
set
方法会触发视图更新,通常是通过通知渲染函数重新执行来实现的。 -
嵌套对象的响应式:当你访问一个对象的属性时,Vue 会递归地将嵌套对象也变成响应式对象。
完整版源码(源码中包含 Vue 的依赖管理和优化)
如果你想查看 Vue 3 reactive
和其他响应式 API(如 ref
)的完整实现,可以参考 Vue 3 的源码库,具体代码位于 packages/reactivity
文件夹下。
你可以从 Vue 3 GitHub 仓库 下载完整的源码。
具体的 reactive
实现代码会涉及更多的优化和功能,比如依赖追踪、缓存、代理标识符等复杂逻辑,建议直接查看 Vue 3 的源码进行深入学习。
相关文章:
vue3 reactive响应式实现源码
Vue 3 的 reactive 是基于 JavaScript 的 Proxy 实现的,因此它通过代理机制来拦截对象的操作,从而实现响应式数据的追踪。下面是 Vue 3 的 reactive 源码简化版。 Vue 3 reactive 源码简化版 首先,我们需要了解 reactive 是如何工作的&…...

git的使用(简洁版)
什么是 Git? Git 是一个分布式版本控制系统 (DVCS),用于跟踪文件的更改并协调多人之间的工作。它由 Linus Torvalds 在 2005 年创建,最初是为了管理 Linux 内核的开发。Git 的主要目标是提供高效、易用的版本控制工具,使得开发者…...
使用命令行创建 Maven 项目
本指南将引导您通过命令行创建一个简单的 Maven 项目。本教程假设您已经在您的机器上安装了 Maven 和 JDK 21。 第一步:验证 Maven 和 Java 安装 在开始之前,我们需要验证 Maven 和 Java 是否已正确安装在您的系统上。 验证 Maven 安装 打开命令行终…...

JVM_栈详解一
1、栈的存储单位 **栈中存储什么?**, 每个线程都有自己的栈,栈中的数据都是以栈帧(Stack Frame)的格式存在。在这个线程上正在执行的每个方法都各自对应一个栈帧(Stack Frame)。 栈帧是一个内存…...
Linux 金仓数据库安装和使用
文章目录 Linux 金仓数据库安装和简单使用 一、下载二、安装三、启动法1. 通用启动方式法2. 系统服务启动方式 四、测试五、DB管理工具1. 启动DB管理工具2. DB管理工具的常用功能 六、卸载 Linux 金仓数据库安装和简单使用 一、下载 打开官网 https://www.kingbase.com.cn/xzz…...

STM32笔记(串口IAP升级)
一、IAP简介 IAP(In Application Programming)即在应用编程, IAP 是用户自己的程序在运行过程中对 User Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产 品中的固件程序进行更新升级。 通常实…...

C++网络编程:select IO多路复用及TCP服务器开发
C网络编程:使用select实现IO多路复用 一、什么是 IO 多路复用?二、IO多路复用器 select三、相关接口3.1、fd_set 结构体3.2、宏和函数 四、select 实现 TCP 服务器五、总结 一、什么是 IO 多路复用? 在网络编程中,最容易想到的并…...

部署 L2JMobius 天堂2芙蕾雅版本
首先下载所需要的服务器端 “L2J_Mobius.zip” 和芙蕾雅客户端(三个压缩文件), 我的网盘下载:https://pan.baidu.com/s/1XdlcCFPvXnzfwFoVK7Sn7Q?pwdavd4 所有文件都在“芙蕾雅”目录下,也可以加入企鹅交流裙 87470…...

C#开发合集
用C#轻松搞定m3u8视频下载与合并 嘿,程序员们!今天咱们来聊聊如何用C#写个小程序,轻松下载和合并m3u8视频文件。没错,就是那种分段的流媒体视频。准备好了吗?让我们开始吧! 准备工作 在动手之前…...

鸿蒙面试 --- 性能优化
性能优化可以从三个方面入手 感知流畅、渲染性能、运行性能 感知流畅 在应用开发中,动画可以为用户界面增添生动、流畅的交互效果,提升用户对应用的好感度。然而,滥用动画也会导致应用性能下降,消耗过多的系统资源,…...
React的基础知识:Context
1. Context 在 React 中,Context 提供了一种通过组件树传递数据的方式,无需手动在每个层级传递 props。这在处理一些全局应用状态时非常有用,比如用户认证、主题、语言偏好等。 如何使用 Context 创建 Context:首先,…...

微知-lspci访问到指定的PCIe设备的几种方式?(lspci -s bus;lspci -d devices)
通过bdf号查看 -s (bus) lspci -s 03:00.0通过vendor id或者device id等设备查看 -d (device) lspci -d 15b3: #这里是vendor号,所以在前面 lspci -d :1021 #这里是设备号,所以要:在前vendorid和deviceid…...
【Kubernetes 集群核心概念:Pod】pod生命周期介绍【五】
5.1 Pod生命周期 Pod的生命周期指的是从Pod创建到终止的整个过程。它分为以下两种常见情况: 长期运行Pod: 例如运行HTTP服务的Pod,它在正常情况下会一直运行,但可以手动删除或终止。短期运行Pod: 例如执行计算任务的…...
c++的虚继承说明、案例、代码
虚继承的基本概念 在 C 中,虚继承主要用于解决多继承时可能出现的菱形继承问题。菱形继承是指一个类有两个(或更多)子类,而这两个子类又同时继承自一个共同的基类,当这些子类又被另一个类继承时,就形成了菱…...

小米PC电脑手机互联互通,小米妙享,小米电脑管家,老款小米笔记本怎么使用,其他品牌笔记本怎么使用,一分钟教会你
说在前面 之前我们体验过妙享中心,里面就有互联互通的全部能力,现在有了小米电脑管家,老款的笔记本竟然用不了,也可以理解,毕竟老款笔记本做系统研发的时候没有预留适配的文件补丁,至于其他品牌的winPC小米…...
介绍SSD硬盘
SSD硬盘(固态硬盘,Solid State Drive)是一种利用闪存技术存储数据的存储设备,与传统的机械硬盘(HDD)不同,SSD没有任何活动部件,因此其性能和耐用性较为优越。以下是SSD硬盘的一些主要…...
CMAKE常用命令详解
NDK List基本用法 Get–获取列表中指定索引的元素 list(Get list_name index output_var)解释 list_name: 要操作集合的名称index: 要取得的元素下标output_var: 保存从集合中取得元素的结果 栗子 list(GET mylist 0 first_element) # 获取第一个元素APPEND–在列表末尾…...

Vue3的通灵之术Teleport
前言 近期Vue3更新了一些新的内容,我都还没有一个一个仔细去看,但是还是有必要去解读一下新内容的。就先从Teleport 开始吧。 官方对 Teleport 的解释是:<Teleport> 是一个内置组件,它可以将一个组件内部的一部分模板“传…...

ue5第三人称闯关游戏学习(一)
视频资料38 - Compilers and Editors_哔哩哔哩_bilibili 上一个第一人称射击项目做完 接下来要更深入学习。 引入资产与C来创建第三人称闯关游戏 这次要引入的资产有两个分别是 Unreal Learning Kit:Game和stylized character kit: casual 01 不过有个比较麻…...

IIC 随机写+多次写 可以控制写几次
verilog module icc_tx#(parameter SIZE 2 , //用来控制写多少次 比如地址是0000 一个地址只能存放8bit数据 超出指针就会到下一个地址0001parameter CLK_DIV 50_000_000 ,parameter SPEED 100_000 ,parameter LED 50 )( input wire c…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...

Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...

实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...

WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...
2025.6.9总结(利与弊)
凡事都有两面性。在大厂上班也不例外。今天找开发定位问题,从一个接口人不断溯源到另一个 接口人。有时候,不知道是谁的责任填。将工作内容分的很细,每个人负责其中的一小块。我清楚的意识到,自己就是个可以随时替换的螺丝钉&…...