当前位置: 首页 > news >正文

vue3.3中ref和reactive原理源代码分析

源码是ts编写的,这里部分简化成js便于阅读

function ref(value) {return createRef(value, false)
}function createRef(rawValue, shallow) { //shallow是否是浅层定义数据,用于区别ref和shallowRefif (isRef(rawValue)) {//如果已经是ref直接返回源数据return rawValue}return new RefImpl(rawValue, shallow)
}class RefImpl<T> {private _value: Tprivate _rawValue: Tpublic dep?: Dep = undefinedpublic readonly __v_isRef = trueconstructor(value: T,//第一个参数value:传入的源数据public readonly __v_isShallow: boolean //第二个参数__v_isShallow:是否是浅层次响应的属性) {this._rawValue = __v_isShallow ? value : toRaw(value)//toRaw是为了防止死循环this._value = __v_isShallow ? value : toReactive(value)//初始化数据如果是已经包装过的__v_isShallow就是true,否则通过toReactive包装传入的参数}get value() {trackRefValue(this) //依赖收集return this._value}set value(newVal) {const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal)//判断是否已经是vue包装过的对象newVal = useDirectValue ? newVal : toRaw(newVal)if (hasChanged(newVal, this._rawValue)) {this._rawValue = newValthis._value = useDirectValue ? newVal : toReactive(newVal)//如果已经包装过返回源数据,否则通过toReactive包装传入的参数triggerRefValue(this, newVal)//触发响应式更新}}
}toReactive = (value) => isObject(value) ? reactive(value) : value //基本数据类型通过class类依赖收集触发更新,引用数据类型通过Proxy代理实现isObject = (val) => val !== null && typeof val === 'object' //上面用到的函数:判断是否是一个对象//reactive()函数调用createReactiveObject函数(内部通过new Proxy())创建响应式数据,如下:function createReactiveObject(target: Target,isReadonly: boolean,baseHandlers: ProxyHandler<any>,collectionHandlers: ProxyHandler<any>,proxyMap: WeakMap<Target, any>
) {if (!isObject(target)) { //如果不是对象直接返回源数据,所以必须传入对象才有效if (__DEV__) {console.warn(`value cannot be made reactive: ${String(target)}`)}return target}// target is already a Proxy, return it.// exception: calling readonly() on a reactive objectif (target[ReactiveFlags.RAW] &&!(isReadonly && target[ReactiveFlags.IS_REACTIVE])) {return target}// target already has corresponding Proxyconst existingProxy = proxyMap.get(target)if (existingProxy) {return existingProxy}// only specific value types can be observed.const targetType = getTargetType(target)if (targetType === TargetType.INVALID) {return target}const proxy = new Proxy(//创建Proxy代理target,targetType === TargetType.COLLECTION ? collectionHandlers : baseHandlers)proxyMap.set(target, proxy)return proxy
}

总结:

ref() 函数通过调用new RefImpl(rawValue, shallow)这个class类来包装数据,内部有value属性(可读get通过trackRefValue收集依赖;可写set通过triggerRefValue更新依赖), 传入的值会调用toReactive函数进行封装. 
toReactive = (value) => isObject(value) ? reactive(value) : value

isObject = (val) => val !== null && typeof val === 'object'

reactive()函数调用createReactiveObject函数(内部通过new Proxy())创建响应式数据

ref:定义基本数据类型通过class类中的value属性依赖收集触发更新;定义引用数据类型会调用reactive()实现数据代理

reactive:只用于定义引用数据类型,通过Proxy代理实现

附源码地址 https://github.com/vuejs/core/tree/v3.3.4/packages/reactivity/src

相关文章:

vue3.3中ref和reactive原理源代码分析

源码是ts编写的,这里部分简化成js便于阅读 function ref(value) {return createRef(value, false) }function createRef(rawValue, shallow) { //shallow是否是浅层定义数据,用于区别ref和shallowRefif (isRef(rawValue)) {//如果已经是ref直接返回源数据return rawValue}retu…...

10.Oracle中decode函数

【函数格式】&#xff1a; decode ( expression, condition_01, result_01, condition_02, result_02, ......, condition_n, result_n, result_default) 【函数说明】&#xff1a; 若表达式expression值与condition_01值匹配&#xff0c;则返回result_01&#xff0c;…...

Podman安装部署kafka和管理界面(快速跑起来)

#1.拉取镜像 podman pull bitnami/zookeeper podman pull bitnami/kafka#2.创建子网 podman network create knet#3.创建zookeeper podman run -itd --name zookeeper-server -p 2181:2181 \ --net knet \ -e ALLOW_ANONYMOUS_LOGINyes \ bitnami/zookeeper:latest#3.1查看z…...

Hbase文档--架构体系

阿丹&#xff1a; 基础概念了解之后了解目标知识的架构体系&#xff0c;就能事半功倍。 架构体系 关键组件介绍&#xff1a; HBase – Hadoop Database&#xff0c;是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统&#xff0c;利用HBase技术可在廉价PC Server上搭建起…...

stm32基于HAL库驱动外部SPI flash制作虚拟U盘

stm32基于HAL库驱动外部SPI flash制作虚拟U盘 &#x1f4cc;参考文章&#xff1a;https://xiaozhuanlan.com/topic/6058234791&#x1f39e;实现效果演示&#xff1a; &#x1f516;上图中的读到的FLASH_ID所指的是针对不同容量&#xff0c;所对应的ID。 //W25X/Q不同容量对应…...

vue3-ts- element-plus新增组件-过滤

新增组件-所有值为空时过滤 <el-form-item label"家庭成员"><divclass"username-box"v-for"(item, index) in form.namelist":key"index"><div>姓名&#xff1a;<el-input v-model"item.name" placeho…...

PostgreSQL SQL优化

Oracle SQL优化 一、在字段里面写的子查询放到from后面&#xff0c;用left join&#xff0c;会大幅提高SQL查询速度。 一、在字段里面写的子查询放到from后面&#xff0c;用left join&#xff0c;会大幅提高SQL查询速度。...

debian12网络静态ip配置-OSSIM 安全漏洞扫描系统平台

本配置适合于服务器上的静态ip配置&#xff0c;该方法简单可靠。 1 临时配置 ifconfig eth0 192.168.1.97 netmask 255.255.255.0 broadcast 192.168.1.255 ip route add default via 192.168.1.1 2 主要的网络配置文件 /etc/network/interfaces /etc/resolv.conf 3 配置…...

微软 Visual Studio 现已内置 Markdown 编辑器,可直接修改预览 .md 文件

Visual Studio Code V1.66.0 中文版 大小&#xff1a;75.30 MB类别&#xff1a;文字处理 本地下载 Markdown 是一种轻量级标记语言&#xff0c;当开发者想要格式化代码但又不想牺牲易读性时&#xff0c;Markdown 是一个很好的解决方案&#xff0c;比如 GitHub 就使用 Markdo…...

阿里云通义千问开源第二波!大规模视觉语言模型Qwen-VL上线魔搭社区

通义千问开源第二波&#xff01;8月25日消息&#xff0c;阿里云推出大规模视觉语言模型Qwen-VL&#xff0c;一步到位、直接开源。Qwen-VL以通义千问70亿参数模型Qwen-7B为基座语言模型研发&#xff0c;支持图文输入&#xff0c;具备多模态信息理解能力。在主流的多模态任务评测…...

在腾讯云服务器OpenCLoudOS系统中安装Jenkins(有图详解)

Jenkins介绍 Jenkins是一个开源软件项目&#xff0c;是基于java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件的持续集成变成可能。 将项目代码的svn地址配置在Jenkins&#xff0c;就可以直接在Je…...

《vue3实战》在created生命周期中运用slice()方法结合element plus组件实现电影评价系统的分页

目录 前言 电影评价系统的分页是什么&#xff1f;它具体的作用体现在哪些方面&#xff1f; 一、slice的含义、语法和作用以及created的作用 slice是什么&#xff1f;slice有什么语法&#xff1f;slice的作用体现在哪些方面&#xff1f; created生命周期的作用&#xff1a;…...

NO.04 MyBatis的各种查询功能

目录 1、查询一个实体类对象 2、查询一个List集合 3、查询单个数据 5、查询多条数据并存储在Map集合中 5.1 方法一&#xff1a;将数据存储在map集合中&#xff0c;再将map集合存储在List集合中 5.2 方法二&#xff1a;将数据存储在map集合中 6、MyBatis中为Java中常用的…...

Spring循环依赖

一、Autowired依赖注入的缓存 二、Resource依赖注入过程 三、循环依赖 singletonObjects&#xff1a;缓存经过了完整生命周期的beanearlySingletonObjects&#xff1a;缓存未经过完整生命周期的bean&#xff0c;如果某个bean出现了循环依赖&#xff0c;就会提前把这个暂时未经过…...

docker以distribution和registry管理个人镜像仓库

目录 一.distribution 1.扩展源下载docker-distribution并启动 2.打标签并认证安全仓库 3.推送到私人仓库 4.拉取镜像 二.registry 1.拉取registry的镜像 2.运行容器并打标签 3.认证安全仓库 4.推送到私人仓库 5.拉取镜像 一.distribution 1.扩展源下载docker-dist…...

2023京东酒类市场数据分析(京东数据开放平台)

根据鲸参谋平台的数据统计&#xff0c;今年7月份京东平台酒类环比集体下滑&#xff0c;接下来我们一起来看白酒、啤酒、葡萄酒的详情数据。 首先来看白酒市场。 鲸参谋数据显示&#xff0c;7月份京东平台白酒的销量为210万&#xff0c;环比下滑约49%&#xff1b;销售额将近19…...

Android中的APK打包与安全

aapt2命令行实现apk打包 apk文件结构 classes.dex&#xff1a;Dex&#xff0c;即Android Dalvik执行文件 AndroidManifest.xml&#xff1a;工程中AndroidManifest.xml编译后得到的二进制xml文件 META-INF&#xff1a;主要保存各个资源文件的SHA1 hash值&#xff0c;用于校验…...

HTTPS单向认证与双向认证

HTTPS单向认证与双向认证 HTTPSCA证书单向认证双向认证 HTTPS Https就是HTTPSSL/TSL的简称。 SSL(Secure Socket Layer 安全套接层)是TCP/IP协议中基于HTTP之下TCP之上的一个可选协议层。 起初HTTP在传输数据时使用的是明文&#xff0c;传输过程中并不安全。网景&#xff08;N…...

(七) ElasticSearch 分词器

1.分词器 分词器是 Elasticsearch 用于将文本拆分为单词&#xff08;词项&#xff09;的组件&#xff0c;以便于搜索和索引。以下是一些关于 Elasticsearch 分词器的常见问题和相关操作的介绍&#xff1a; 1&#xff09;什么是分词器&#xff1f; 分词器是 Elasticsearch 中…...

足球- EDA的历史数据分析并可视化

足球- EDA的历史数据分析并可视化 背景数据介绍探索数据时需要遵循的一些方向:数据处理导入库数据探索 数据可视化赛事分析主客场比分相关性分析时间序列分析 总结 背景 该数据集包括从1872年第一场正式比赛到2023年的44&#xff0c;341场国际足球比赛的结果。比赛范围从FIFA世…...

Perplexity实时追踪offer状态?不,但你能用它反向验证录取概率——基于3年1,246条真实案例的数据建模法

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Perplexity留学信息查询 Perplexity 是一款基于大语言模型的实时信息检索工具&#xff0c;其“学术模式”与“引用溯源”能力特别适用于留学申请者快速获取权威、时效性强的海外院校政策、截止日期、语…...

高频电路中的隐形卫士:深度解析开关二极管BAV99的选型与应用

1. 高频电路中的隐形挑战&#xff1a;为什么需要BAV99&#xff1f; 当你设计一个高速数字接口或者射频模块时&#xff0c;最头疼的问题往往不是功能实现&#xff0c;而是那些看不见的高频干扰。我曾经在一个USB3.0接口保护电路的设计中&#xff0c;就因为选错了二极管&#xff…...

大模型应用开发:从需求分析到上线的全流程指南

一、需求分析&#xff1a;锚定测试视角下的开发方向对于软件测试从业者而言&#xff0c;大模型应用开发的需求分析阶段&#xff0c;核心是跳出传统功能测试的思维局限&#xff0c;从“验证功能正确性”转向“定义AI能力边界”。首先要明确业务场景的核心诉求&#xff0c;比如开…...

从Ubuntu 16.04到自定义Rootfs:Firefly-RK3399系统镜像DIY全记录

从Ubuntu 16.04到自定义Rootfs&#xff1a;Firefly-RK3399系统镜像DIY全记录 在嵌入式开发领域&#xff0c;Firefly-RK3399凭借其强大的六核ARM架构和丰富的扩展接口&#xff0c;成为众多开发者的首选平台。然而&#xff0c;官方提供的Ubuntu 16.04镜像往往无法满足特定项目需求…...

别再混淆了!一文理清华为云Stack里FusionStorage、OceanStor Pacific与存储服务的对应关系

华为云Stack存储产品演进史&#xff1a;从FusionStorage到OceanStor Pacific的技术脉络解析 在云计算基础设施领域&#xff0c;存储系统的命名规则往往反映了技术架构的迭代路径。华为云Stack作为企业级混合云解决方案&#xff0c;其存储产品线经历了多次重大技术革新与品牌整合…...

如何3步解决Mac NTFS读写难题:Nigate终极免费开源方案

如何3步解决Mac NTFS读写难题&#xff1a;Nigate终极免费开源方案 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and management fo…...

从零到一:ComfyUI IPAdapter 图像风格迁移终极指南

从零到一&#xff1a;ComfyUI IPAdapter 图像风格迁移终极指南 【免费下载链接】ComfyUI_IPAdapter_plus 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_IPAdapter_plus 你是否曾梦想过将自己拍摄的照片变成大师级的艺术作品&#xff1f;或者想把朋友的肖像变成…...

用Python和pywifi写个WiFi密码测试工具(附完整GUI源码)

用Python构建WiFi安全测试工具&#xff1a;从原理到GUI实现 在数字化时代&#xff0c;WiFi安全已成为个人和企业网络安全的第一道防线。作为Python开发者&#xff0c;我们如何利用技术手段来验证自身网络的安全性&#xff1f;本文将带你从零开始构建一个基于pywifi库的WiFi连接…...

Linux网络数据包处理全流程:从系统调用到网卡驱动的深度解析

1. 项目概述&#xff1a;从代码到比特流的旅程如果你在Linux上写过网络程序&#xff0c;无论是用C的send()还是Python的socket.sendall()&#xff0c;你可能都曾好奇过&#xff1a;我调用完这个函数之后&#xff0c;数据到底经历了什么才变成网线上的电信号&#xff1f;反过来&…...

创业公司如何设计有效的OKR

创业公司如何设计有效的OKR 前言 创业第一年&#xff0c;我们没有明确的目标&#xff0c;大家都很忙&#xff0c;但不知道忙什么。每个人都在做事&#xff0c;但好像没有形成合力。 后来我开始研究 OKR&#xff08;Objectives and Key Results&#xff09;&#xff0c;发现这不…...