《Vue进阶教程》第三十一课:ref的初步实现
往期内容:
《Vue进阶教程》第二十课:lazy懒执行
《Vue进阶教程》第二十一课:支持缓存
《Vue进阶教程》第二十二课:自定义更新(调度器)
《Vue进阶教程》第二十三课:渲染计算属性的结果
《Vue进阶教程》第二十四课:优化
《Vue进阶教程》第二十五课:watch基本概念
《Vue进阶教程》第二十六课:实现侦听函数
《Vue进阶教程》第二十七课:实现侦听对象
《Vue进阶教程》第二十八课:实现新旧值
《Vue进阶教程》第二十九课:立即执行的回调
《Vue进阶教程》第三十课:watchEffect
1 为什么需要ref
由于proxy只能代理引用类型数据(如: 对象, 数组, Set, Map...), 需要一种方式代理普通类型数据(String, Number, Boolean...)
设计ref主要是为了处理普通类型数据, 使普通类型数据也具有响应式
除此之外, 通过reactive代理的对象可能会出现响应丢失的情况. 使用ref可以在一定程度上解决响应丢失问题
2 初步实现
1) 包裹对象
既然proxy不能代理普通类型数据, 我们可以在普通类型数据的外层包裹一个对象
用proxy代理包裹的对象(wrapper). 为了统一, 给包裹对象定义value属性, 最后返回wrapper的代理对象
function ref(value) {const wrapper = {value: value,}return reactive(wrapper)
}
测试用例
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><script src="./reactive.js"></script></head><body><script>function ref(value) {const wrapper = {value: value,}return reactive(wrapper)}// count是一个proxy对象const count = ref(1)effect(() => {// 访问proxy对象的属性 触发 getter 收集依赖console.log(count.value)})setTimeout(() => {count.value = 2}, 1000)</script></body>
</html>
2) 添加标识
按照上面的实现, 我们就无法区分一个代理对象是由ref创建, 还是由reactive创建, 比如下面的代码
ref(1)
reactive({value: 1})
为了后续能够对ref创建的代理对象自动脱ref处理, 即不用.value访问.
考虑给ref创建的代理对象添加一个标识
示例
function ref(value) {const wrapper = {value: value,}// 给wrapper添加一个不可枚举, 不可写的属性__v_isRefObject.defineProperty(wrapper, '__v_isRef', {value: true,})return reactive(wrapper)
}
在Vue3源码中, 虽然不是按上述方式实现的, 但是可以这样去理解
相关文章:
《Vue进阶教程》第三十一课:ref的初步实现
往期内容: 《Vue进阶教程》第二十课:lazy懒执行 《Vue进阶教程》第二十一课:支持缓存 《Vue进阶教程》第二十二课:自定义更新(调度器) 《Vue进阶教程》第二十三课:渲染计算属性的结果 《Vue进阶教程》第二十四课&…...
C语言初阶习题【19】三子棋游戏
1.实现三子棋游戏 2.思路 我们把游戏实现部分放在game.c和game.h中,把游戏的测试代码放到test.c中 main函数在test.c中。 2.1 test.c中 先写main 函数,在main函数中调用test函数。 int main() {test();return 0; }test.c函数实现让玩家进行选择是否…...
Linux day 1129
家人们今天继续学习Linux,ok话不多说一起去看看吧 三.Linux常用命令 3.1 Linux命令体验 3.1.1 常用命令演示 在这一部分中,我们主要介绍几个常用的命令,让大家快速感 受以下 Linux 指令的操作方式。主要包含以下几个指令: ls命…...
【优化算法】梯度优化算法:一种新的原启发式优化算法算法
目录 1.摘要2.算法原理3.结果展示4.参考文献5.获取代码 1.摘要 本文提出了一种新型的元启发式优化算法——梯度优化器(Gradient-based Optimizer, GBO)。GBO算法灵感来源于牛顿法,采用两个主要操作:梯度搜索规则(Grad…...
内部类(3)
大家好,今天我们继续来看看内部类,今天我们来学习一下内部类的分类,我们来看看一共有几种,它们有什么作用,那么话不多说,我们直接开始。 9.1 内部类的分类 先来看下,内部类都可以在一个类的哪些位置进行定…...
svn分支相关操作(小乌龟操作版)
在开发工作中进行分支开发,涉及新建分支,分支切换,合并分支等 新建远程分支 右键选择branch/tagert按钮 命名分支的路径名称 点击确定后远程分支就会生成一个当时命名的文件夹(开发分支) 分支切换 一般在开发阶段&a…...
rust_shyper
title: 探索 Rust_Shyper:系统编程的新前沿 date: ‘2024-12-30’ category: blog tags: Rust_ShyperRust 语言系统编程性能与安全 sig: Virt archives: ‘2024-12’ author:way_back summary: Rust_Shyper 作为基于 Rust 语言的创新项目,在系统编程领域…...
HAL 库 HAL_UARTEx_ReceiveToIdle_IT 函数解析
一、存在位置:stm32f1xx_hal_uart.c 二、具体代码 二、返回值:HAL_StatusTypeDef 通过查看返回值HAL_StatusTypeDef在stm32f1xx_hal_edf.h文件中定义为结构体类型。 status:(进展的)状况,情形 三、函数名…...
【ArcGIS Pro】完整的nc文件整理表格模型构建流程及工具练习数据分享
学术科研啥的要用到很多数据,nc文件融合了时间空间数据是科研重要文件。之前分享过怎样将nc文件处理成栅格后整理成表格。小编的读者还是有跑不通整个流程的,再来做一篇总结篇,也分享下练习数据跟工具,如果还是弄不了的࿰…...
REDIS的集群
REDIS的集群模式: 主从模式:redis高可用的基础,哨兵和集群都是建立在此基础之上 特点: 主从模式和数据库的主从模式(工作模式)是一样的,主负责写入,然后把写入到数据同步到从&…...
酒店管理系统的设计与实现【源码+文档+部署讲解】
酒店管理系统的设计与实现 摘 要 中国经济近几年来取得蓬勃飞速发展,使得人民生活水平的要求和生活的质量有了很高的要求。因此人们对外出旅游和就餐的需求也越来越大。同时,随着我国科技水平的兴起和对互联网新时代的大力支持,酒店管理系统在…...
[论文阅读] (34)ESWA2024 基于SGDC的轻量级入侵检测系统
《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学术路上期…...
从社区共识到资本效能:解析SYNBO的去中心化投资协议创新
Web3 资本市场正处于深刻变革的关键节点。随着去中心化技术的不断进化,传统风险投资模式逐渐显现出效率、透明性与公平性等方面的局限性。而 SYNBO 的出现,为这一市场注入了全新的可能性。 作为新一代去中心化风险投资协议,SYNBO 不仅创新性地…...
一、数据库 Sqlite3 资料
SQLite3 教程 SQLite3 是一个轻量级的嵌入式数据库引擎,它不需要单独的服务器进程,数据库直接存储在磁盘文件中。Python 内置了 sqlite3 模块,可以方便地操作 SQLite 数据库。以下是 SQLite3 的详细教程。 1. SQLite3 简介 SQLite3 是一个自…...
Passlib库介绍及使用指南
什么是Passlib? Passlib是一个强大的Python密码哈希库,它支持多种哈希算法和工具。 Passlib不仅提供了易于使用的API,还集成了多种安全特性,如加盐、密钥派生函数等,广泛应用于用户账户系统、敏感数据保护和多因素认证…...
模型选择+过拟合欠拟合
训练误差和泛化误差 训练误差:模型在训练数据上的误差 泛化误差:模型在新数据上的误差 验证数据集:一个用来评估模型好坏的数据集 例如拿出50%的数据作为训练 测试数据集:只能用一次 K则交叉验证 在没有足够数据时使用 算法…...
绝美的数据处理图-三坐标轴-散点图-堆叠图-数据可视化图
clc clear close all %% 读取数据 load(MyColor.mat) %读取颜色包for iloop 1:25 %提取工作表数据data0(iloop) {readtable(data.xlsx,sheet,iloop)}; end%% 解析数据 countzeros(23,14); for iloop 1:25index(iloop) { cell2mat(table2array(data0{1,iloop}(1,1)))};data(i…...
损失函数-二分类和多分类
二分类和多分类的损失函数 二分类 损失函数 L ( y , y ^ ) − ( y l o g ( y ^ ) ) ( 1 − y ) l o g ( 1 − y ^ ) L(y,\hat{y}) -(ylog(\hat{y})) (1-y)log(1-\hat{y}) L(y,y^)−(ylog(y^))(1−y)log(1−y^) 其中真实标签表示为y(取值为 0 或 1&#…...
汽车损坏识别检测数据集,使用yolo,pasical voc xml,coco json格式标注,6696张图片,可识别11种损坏类型,识别率89.7%
汽车损坏识别检测数据集,使用yolo,pasical voc xml,coco json格式标注,6696张图片,可识别11种损坏类型损坏: 前挡风玻璃(damage-front-windscreen ) 损坏的门 (damaged-d…...
从 Elastic 迁移到 Easysearch 指引
从 Elasticsearch 迁移到 Easysearch 需要考虑多个方面,这取决于当前使用的 Elasticsearch 版本、能容忍的停机时间、应用需求等。在此背景下,我们梳理了一下通用的升级指引,方便大家进行迁移工作。 迁移路径 Elasticsearch 版本快照兼容推…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
