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

《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源码中, 虽然不是按上述方式实现的, 但是可以这样去理解

http://www.lryc.cn/news/512523.html

相关文章:

  • C语言初阶习题【19】三子棋游戏
  • Linux day 1129
  • 【优化算法】梯度优化算法:一种新的原启发式优化算法算法
  • 内部类(3)
  • svn分支相关操作(小乌龟操作版)
  • rust_shyper
  • HAL 库 HAL_UARTEx_ReceiveToIdle_IT 函数解析
  • 【ArcGIS Pro】完整的nc文件整理表格模型构建流程及工具练习数据分享
  • REDIS的集群
  • 酒店管理系统的设计与实现【源码+文档+部署讲解】
  • [论文阅读] (34)ESWA2024 基于SGDC的轻量级入侵检测系统
  • 从社区共识到资本效能:解析SYNBO的去中心化投资协议创新
  • 一、数据库 Sqlite3 资料
  • Passlib库介绍及使用指南
  • 模型选择+过拟合欠拟合
  • 绝美的数据处理图-三坐标轴-散点图-堆叠图-数据可视化图
  • 损失函数-二分类和多分类
  • 汽车损坏识别检测数据集,使用yolo,pasical voc xml,coco json格式标注,6696张图片,可识别11种损坏类型,识别率89.7%
  • 从 Elastic 迁移到 Easysearch 指引
  • Yapi RCE 复现和批量编写
  • 【2024年-9月-21日-开源社区openEuler实践记录】PilotGo:简化运维管理的开源利器
  • ubuntu 20.04 国内源安装docker
  • 比亚迪30亿教育慈善基金正式启动,助推中国科教进步
  • 【链表】重排链表,看似复杂实则并不简单~
  • yakit-靶场-高级前端加解密与验签实战(for嵌套纯享版)
  • 洛谷 P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布
  • NLP论文速读(NeurIPS 2024)|BERT作为生成式上下文学习者BERTs are Generative In-Context Learners
  • 亚马逊云科技 | Amazon Nova:智能技术新势力
  • Kali 自动化换源脚本编写与使用
  • 【已解决】PDF文档有密码怎么办(2024新)免费在线工具PDF2Go