VUE设计与实现共读系列之ref的实现【响应式原理】

前言

我们先顺一下vue使用响应式数据的流程:
vue 是通过 refreactive 来创建响应式值,改变响应式值,视图跟着发生变化。
我们今天就来看一下refreactive是如何实现的

准备

首先,打开ref函数的位置
在这里插入图片描述
我们可以看到一个被ref包裹的响应式数据,其实是一个RefImpl对象
在这里插入图片描述

1. 创建ref

export function ref(value) {return createRef(value);
}function createRef(value) {const refImpl = new RefImpl(value);return refImpl;
}

可以看到创建一个ref对象的本质就是创建一个RefImpl装饰对象

2. 编写RefImpl对象

export class RefImpl {private _rawValue: any; // 原值private _value: any;	// 代理值public dep;	// 依赖数组:用来存放依赖public __v_isRef = true; // 区分是否是ref这个对象类型constructor(value) {this._rawValue = value;// 看看value 是不是一个对象,如果是一个对象的话// 那么需要用 reactive 包裹一下this._value = convert(value);this.dep = createDep();  // 创建effect对象}get value() {// 收集依赖trackRefValue(this);return this._value;}set value(newValue) {// 当新的值不等于老的值的话,// 那么才需要触发依赖if (hasChanged(newValue, this._rawValue)) {// 更新值this._value = convert(newValue);this._rawValue = newValue;// 触发依赖triggerRefValue(this);}}
}

❤️❤️ 为什么要有_rawValue_value呢?

答:_value用来保存我们加工后的具有响应式的对象,_rawValue保存的是原始的值

3. 依赖收集和触发

依赖收集

// trackRefValue
export function trackRefValue(ref) {if (isTracking()) { // 判定师傅可以进行收集trackEffects(ref.dep);}
}// trackEffects
let activeEffect = void 0;export function trackEffects(dep) {// 用 dep 来存放所有的 effectif (!dep.has(activeEffect)) {dep.add(activeEffect);(activeEffect as any).deps.push(dep);}
}
  • activeEffect:作用是用一个全局变量存储被注册的副作用函数

依赖触发

在这里插入图片描述

// ref.ts
export function triggerRefValue(ref) {triggerEffects(ref.dep);
}// effect.ts
export function triggerEffects(dep) {// 执行收集到的所有的 effect 的 run 方法for (const effect of dep) {if (effect.scheduler) {// scheduler 可以让用户自己选择调用的时机// 这样就可以灵活的控制调用了// 在 runtime-core 中,就是使用了 scheduler 实现了在 next ticker 中调用的逻辑effect.scheduler();} else {effect.run();}}
}

思考

  1. ref创建的值 .value有什么用?

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

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

相关文章

SmartSoftHelp8,SQL语句优化,耗时,返回数据行,kb

SQL语句优化 SQL语句耗时测试,耗时优化 SQL语句查询返回数据行统计 SQL语句查询返回数据大小统计,kb 总量统计 下载地址:https://pan.baidu.com/s/1zBgeYsqWnSlNgiKPR2lUYg?pwd8888

施人玫瑰手留余香和影像组学、医学人工智能未来漫谈

今天收到进阶班学员的留言: 提示:本文有硬核软文嫌疑,请慎重阅读。“ 我用您给我们讲的CLEAR,与一个审稿人进行了battle。有理有据。评估下来,我感觉我们的文章还是挺符合CLEAR的。” 我从来不排斥在商言商&#xff0…

12月02日每日信息差

_灵感 🎖 六国入境免签首日2029人次享便利 🎄 国内首个超大规模“光伏气膜”项目在江苏投运 🌍 东京将推出氢气交易市场 🌋 中国疾控中心:建议尽早接种流感疫苗,尤其是老年人和儿童 🎁 偏高1.…

【Qt开发流程】之事件系统1:事件系统描述及键盘事件

Qt的事件系统 在Qt中,事件是对象,派生自抽象的QEvent类,它表示应用程序内部发生的事情或作为应用程序需要知道的外部活动的结果。事件可以由QObject子类的任何实例接收和处理,但它们与小部件特别相关。以下描述了在典型应用程序中…

基于ZLMediaKit的webrtc实时视频传输demo搭建

环境 ubuntu 20.04 ​ gcc version 9.4.0 ​ cmake version 3.16.3 部署ZLMediaKit流媒体服务器 安装openssl 首先可以检查一下自己的openssl的版本如果是1.1.1以上就可以忽略这一步 wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz tar -xvzf openssl-1.1.1k…

酷开科技 | 酷开系统,让家庭娱乐方式焕然一新!

在这个快节奏的社会,家庭娱乐已成为我们日常生活中不可或缺的一部分,为了给家庭带来更多欢笑与感动,酷开科技发力研发出拥有丰富内容和技术的智能电视操作系统——酷开系统,它集合了电影、电视剧、综艺、游戏、音乐等海量内容&…

C语言-指针_01

指针基础 1. 概述 地址编号:计算机为了存储数据,每一个程序在 32位 机中 占4G,最小操作单位 是 一个字节,每一个字节都有其对应的地址,该地址就是 地址编号。 指针:地址编号这个数据 的 数据类型。 指针变…

TPC通信-BS架构

BS架构-基本原理 BS框架基本原理 使用线程池对BS架构进行优化

docker部署typecho博客

文章目录 1.安装git2.安装compose3.拉取仓库4.创建目录5.配置文件修改6.启动容器7.修改MYSQL数据库8.安装成功9.参考GitHub文档 1.安装git 安装git yum -y install git2.安装compose (docker安装参考:docker基本知识) 确保已经安装了 Doc…

爬虫学习-基础(HTTP原理)

目录 一、URL和URI 二、HTTP和HTTPS (1)HTTP (2)HTTPS (3)HTTP与HTTPS区别 (4)HTTPS对HTTP的改进:双问的身份认证 三、TCP协议 (1)TCP三次握手…

⭐ Unity 里让 Shader 动画在 Scene 面板被持续刷新

写 Unity Shader的时候,只有播放状态下的 Game 面板能看到Shader 顺畅的动态效果,不方便。 想要带有动态效果的 Shader 在 Scene 面板持续更新动画,只需要打开一个开关就能让 Scene 持续刷新动画了。 感谢大家的观看,您的点赞和关…

在oracle中的scn技术

SCN可以说是Oracle中一个很基础的部分,但同时它也是一个很重要的。它是系统中维持数据的一致性和顺序恢复的重要标志,是数据库非常重要的一种数据结构。 转载:深入剖析 - Oracle SCN机制详细解读 - 知乎 (zhihu.com)https://zhuanlan.zhihu.…

基于运算放大器的电压采集电路

一、运算放大器 运放推导的两个重要概念:虚短、虚断。 1、差分放大器 以差分放大器为例进行推导分析。 虚断–运放的"-“端、”“端的引脚电流接近为0; 根据基尔霍夫电流定律可知:iR1iRF,iR2iR3; iR1(Ui1-(V-…

C语言结构体详解(一)(能看懂文字就能明白系列)

🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟个人主页: 古德猫宁- 🌟🌟🌟🌟🌟🌟…

04.PostgreSQL是如何实现隔离级别的?

PostgreSQL是如何实现隔离级别的? 事务有哪些特性? 事务看起来感觉简单,但是要实现事务必须要遵守 4 个特性,分别如下: 原子性(Atomicity):一个事务中的所有操作,要么…

Istio新架构揭秘:环境化Mesh

自问世以来,Istio因其使用Sidecar(可编程代理与应用容器一同部署)而备受认可。这种架构选择使Istio用户能够享受其好处,而无需对其应用进行 drast 改变。这些可编程代理,与应用容器紧密部署在一起,因其能够…

java学习part27线程死锁

基本就是操作系统的内容 138-多线程-线程安全的懒汉式_死锁_ReentrantLock的使用_哔哩哔哩_bilibili

【大模型】更强的 ChatGLM3-6B 来了,开源可商用

【大模型】更强的 ChatGLM3-6B 来了,开源可商用 简介ChatGLM3-6B 环境配置环境搭建安装依赖 代码及模型权重拉取拉取 ChatGLM3-6B拉取 ChatGLM3-6B 模型权重及代码 终端测试网页测试安装 gradio加载模型并启动服务 参考 简介 ChatGLM3-6B ChatGLM3-6B 是 ChatGLM …

基于STM32的四轴飞行器的控制系统(论文+源码)

1.系统设计 本次基于stm32单片机的四轴飞行器控制系统主要包括硬件和软件这两大部分,其中硬件部分是基于单片机的四轴飞行器控制系统实现的基石,其中主要STM32单片机负责整个系统功能的实现;NRF24L01无线模块负责对四轴飞行器的远程控制&…

rtmp 协议详解

1. handshake 1.1 概述 rtmp 连接从握手开始。它包含三个固定大小的块。客户端发送的三个块命名为 C0,C1,C2;服务端发送的三个块命名为 S0,S1,S2。 握手序列: 客户端通过发送 C0 和 C1 消息来启动握手过程。客户端必须接收到 S1 消息,然后…