Vue3 刨析响应式原理

news2024/11/16 19:54:35

ref

目标

了解 Vue ,手写一个方法,实现响应式,并读懂响应式

源码

class MyRef {
  constructor(value) {
    this._value = value
  }
  // 访问器
  get value() {
    console.log('触发 getter 函数 访问');
    return this._value
  }
  // 读取器
  set value(newVal) {
    console.log('触发 setter 函数 修改');
    this._value = newVal
  }
}

const c1 = new MyRef(20)
console.log("c1:", c1);
setTimeout(() => {
  c1.value = 30
  console.log("c1:", c1);
}, 3000);

分析

1. 响应式

我们自定义了一个 class 类,并在 class 中写入 constructor 以及 get、set 方法,get value 做依赖收集并派发更新

  1. 第一次读取我们定义的响应式数据时,调用的时getter 方法输出如下
    在这里插入图片描述
  1. 经过修改响应式数据,我们调用 setter 方法,输出如下
    在这里插入图片描述

2. 发布 - 订阅者模式

接下来我们了解一下发布-订阅者模式

  • 首先我们先了解一下定义:
    1. 发布-订阅者 模式其实是一种 对象间一对多 的依赖关系(利用消息对列),一个调度中心对应多个订阅者
    2. 当一个对象的状态(state)发生改变时,所有依赖于它的对象都得到状态改变的通知
    3. 订阅者(Subscriber)把自己想订阅的事件注册(Subscribe)到调度中心(Event Channel)
    4. 当发布者(Publisher)发布该事件(Publish Event)到调度中心,也就是该事件触发时,由调度中心统一调度(Fire Event)订阅者注册到调度中心的处理代码
  • 通俗易懂理解如下:
    1. 我们定义了一个函数,这个函数是一个发布者的事件,订阅者会直接调用发布者的事件,两者就会产生一个耦合,如果要解耦这两者之间的关系,就需要在两者中间加一个调度中心,也就是 Event Channel(一个中介) 。
    2. 发布订阅者模式是一个一对多的映射关系,即一个发布者对应多个订阅者
    3. 通常发布订阅者模式会有一个消息队列(先进先出——array)模式,即一个array中有多个方法,最先声明定义的函数最先调用
    4. 先定义好一个消息队列,然后根据需要的对象去订阅,当订阅的函数的状态发生改变时,对象不在主动触发,而是被动接收
    5. 举例:去书店订阅书籍(on),当没有货时,留下一个联系方式,一旦有了货源,店员就发射(emit)一个消息给用户,触发消息队列(message)去买书,然后off
    6. 实践:
      • 用websocket做一个长连接
      • addEventListener 事件绑定两个事件A和事件B,当你鼠标点击后,状态就会发生变化,状态发生变化,就要按照事件队列先后执行了事件A和事件B

3. 实现数据劫持

在这里插入图片描述

reactive

源码

我们都知道定义引用数据类型(object、array)都是用 reactive 去定义,当我们使用 ref 去定义时 Vue 底层会做一次转换,将 ref 定义的数据转换为 reactive ,下面是分别用 reactive、ref、shallowRef 定义的三种数据,输出结果如下:

const arr1 = reactive([1, 2, 3])
console.log('arr1: ', arr1);

const arr2 = ref([1, 2, 3])
console.log('arr2: ', arr2);

const arr3 = shallowRef([1, 2, 3])
console.log('arr3: ', arr3);

在这里插入图片描述

分析

使用 ref 定义的 array ,系统会转为 reactive ,通过 Vue 源码我们可以看到,在定义响应式数据时,做了一个判断,如果ref传入的是一个引用数据类型,就会将其转换为 reactive ,如果想要避免出现该情况,我们可以使用shallowRef,但是使用shallowRef 修改时,修改的 value 是响应式,但修改 value 值里面的属性不是响应式。
在这里插入图片描述

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

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

相关文章

基于Android新生预报到系统APP的设计与实现

1.引言 随着国家的教育方针政策的不断改变,自20世纪初以来,政府开始实施扩招计划,截至2020年我国大学生总规模己经攀升至近5000万,大学教育的普及化正在逐渐实现。随着大学新生数量的不断增多,到了每年的9月份&#x…

实现Linux(Ubuntu22.04)与Windows文件互通共享(双方永久往来~)

Samba服务器了解(防守) Samba是一个开源软件套件,它允许在不同操作系统之间共享文件、打印机和其他资源。它是基于SMB/CIFS协议,这是一种用于在Windows系统中共享文件和打印机的网络协议。Samba服务器可以在Linux、Unix、macOS和…

玩转C++调试之Python的GDB库增强

玩转C调试之Python的GDB库增强 0.导语 调试是软件开发过程中不可或缺的一环,而GDB(GNU调试器)作为一款功能强大的调试工具,在开发者中得到广泛应用。除了传统的命令行调试功能外,GDB还提供了Python的GDB库,…

2024考研408-计算机组成原理第五章-中央处理器学习笔记

文章目录 前言一、CPU的功能与基本结构1.1、CPU的功能1.2、运算器与控制器需要实现功能1.3、运算器的基本结构1.3.1、基本结构构成(七个部分)1.3.2、各个部件详细介绍①算数逻辑运算单元②通用寄存器组(介绍数据通路的基本结构2个&#xff09…

C语言进阶---字符串+内存函数

本章重点 重点介绍处理字符和字符串的库函数的使用和注意事项。 求字符串长度 strlen() 长度不受限制的的字符串函数 strcpy()strcat()strcmp() 长度受限制的的字符串函数 strncpy()strncat()strncmp() 字符串查找 strstr()strtok() 错误信息报告 strerror() 字符操作内存操作函…

《企业性能测试:体系构建、落地指导与案例解读》——小解送书第四期

目录 介绍 抽奖 介绍 软件系统性能的重要性无须多言,没有哪个用户可以忍受一个响应缓慢的网站或者反应迟钝的软件。软件性能是用户体验的核心。大部分用户可能对软件性能并不了解,但他们永远想使用响应更迅速的软件。所以,性能是评估一个软…

小程序data-*的误区

场景:点击按钮获取data-*的值跳转页面,跳转页获取传过来的参数 binnie: 华哥,为什么有的部分参数传不过去然后显示undefined? 华哥: binnie, 我看了一下你的代码,你错在属性名有大写字母了。我给你写了个…

postman自动生成接口文档

点击: 会自动生成一个文件夹 点击图表,修改名字 新建一个请求,到时候会自动保存到文件夹里面,但是保存前看清楚保存的名字 点击三个点-》点击export即可

Python提取斗鱼美女图片--selenium requests两种方式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 使用selenium,requests提取斗鱼美女数据 数据来源 斗鱼美女链接 一、selenium是干嘛…

Leetcode-每日一题【206.反转链表】

题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5]输出:[5,4,3,2,1] 示例 2: 输入:head [1,2] 输出:[2,1] 示例 3: 输…

ChatGPT助力校招----面试问题分享(七)

1 ChatGPT每日一题:SPI通信协议的四种工作模式 问题:SPI通信协议的四种工作模式 ChatGPT:SPI(Serial Peripheral Interface)总线是一种同步串行通信协议,它在多种数字系统中得到了广泛应用。SPI总线有四种…

nodejs全局模块安装与cnpm

一、通过nodejs官网安装 通过nodejs官网下载后安装 二、验证安装 1、在键盘按下【winR】键,输入cmd,然后回车,打开命令行界面 2、进入命令提示符窗口,分别输入以下命令,显示版本号,则安装成功&#xff0…

【AcWing算法基础课】第二章 数据结构(部分待更)

文章目录 前言课前温习一、单链表核心模板1.1题目描述1.2思路分析1.3代码实现 二、双链表核心模板2.1题目描述2.2思路分析2.3代码实现 三、栈核心模板3.1题目描述3.2思路分析3.3代码实现 四、队列核心模板4.1题目描述4.2思路分析4.3代码实现 五、单调栈核心模板5.1题目描述5.2思…

医疗科技革新:探索互联网医院线上就诊模式

随着互联网的迅猛发展,医疗行业也在逐渐融合科技创新,为患者提供更加便捷、高效的医疗服务。互联网医院作为一种新型医疗模式,通过在线平台实现医生与患者的远程沟通和线上诊疗,成为了医疗科技领域的热门话题。 在本文中&#x…

Django框架-6

向服务器传参 通过url - path传参 path(articles/<int:year>/<int:month>/<slug:slug>/, views.article_detail),查询字符串方式传参 http://localhost:8000?key1value1&key2value2 ;&#xff08;body&#xff09;请求体的方式传参&#xff0c;比如文…

Windos新机配置Java开发环境

一. 安装JDK8 解压&#xff0c;然后配置环境变量即可 配置JAVA_HOME path里添加&#xff1a; 二. MySql数据库安装与配置 参考&#xff1a; https://blog.csdn.net/annita2019/article/details/117467992 1.解压&#xff0c; Path中添加环境变量 D:\CodeSupport\Java_se…

华为OD机试真题 JavaScript 实现【求最大连续bit数】【牛客练习题】

一、题目描述 求一个int类型数字对应的二进制数字中1的最大连续数&#xff0c;例如3的二进制为00000011&#xff0c;最大连续2个1。 二、输入描述 输入一个int类型数字。 三、输出描述 输出转成二进制之后连续1的个数。 四、解题思路 使用位运算来实现。 具体思路如下&…

投票链接步骤公众号投票链接制作制作投票网页链接

大家在选择投票小程序之前&#xff0c;可以先梳理一下自己的投票评选活动是哪种类型&#xff0c;目前有匿名投票、图文投票、视频投票、赛事征集投票等。 我们现在要以“笛乐悠扬”为主题进行一次投票活动&#xff0c;我们可以在在微信小程序搜索&#xff0c;“活动星”投票小程…

高手必备:JVM调优的常用命令和参数一网打尽!

大家好&#xff0c;我是小米&#xff01;在今天的技术分享中&#xff0c;我将和大家一起探讨JVM调优中的常用命令和参数。作为一名热爱技术的小伙伴&#xff0c;希望通过本篇文章的分享&#xff0c;能够帮助大家更好地理解和掌握JVM调优的方法和技巧。 JVM的结构 首先&#x…

C++ 预处理器

预处理器是一些指令&#xff0c;指示编译器在实际编译之前所需完成的预处理。 所有的预处理器指令都是以井号&#xff08;#&#xff09;开头&#xff0c;只有空格字符可以出现在预处理指令之前。预处理指令不是 C 语句&#xff0c;所以它们不会以分号&#xff08;;&#xff09…