Vue3 —— reactive 全家桶及源码学习

news2024/12/26 23:37:15
  • 该文章是在学习 小满vue3 课程的随堂记录
  • 示例均采用 <script setup>,且包含 typescript 的基础用法

前言

上一篇学习了 ref 全家桶,在此基础上一起学习下 reactive 全家桶

一、reactive 对比 ref

  • ref 可以接收 所有类型reactive 只能接收 object类型(array、object、Map、Set)
  • ref 在取值和赋值时都要通过 .valuereactive不需要
  • reactive 不能直接整体赋值,因为它是通过 proxy 创建的响应式对象,直接赋值会 破坏响应式
    • 解决方案 1:可以 调用一些原生操作,比如 数组可用 push、pop 等去修改
    • 解决方案 2:外面再包上一层

① 创建

import { reactive } from "vue";

// object类型
const form = reactive({
  name: "xiaoman",
  age: 18,
});

// array类型
const list = reactive<string[]>([]);

② 修改

// 错误。直接整体赋值会破坏响应式
// list = ["a", "b", "c"];

// 可以通过原生方法去操作数据,不会破坏响应式
setTimeout(() => {
  const res = ["jay chou", "jolin"];
  list.push(...res);
}, 1000);

// 或者在外面包一层,这样对 obj.list 就可以整体赋值了
const obj = reactive<{ list: string[] }>({
  list: [],
});
setTimeout(() => {
  obj.list = ["a", "b", "c"];
}, 2000);

二、将 reactive 的值 设置为 readonly

  • 设置为 readonly 后不可修改
  • 修改 reactive 源数据,readonly 的值也会受影响
const info = reactive({
  name: "xiaoman",
});
const rd = readonly(info);

// 设置为 readonly 后不可修改
// rd.name = 'daman'

// 但是可以修改它的源数据
info.name = "blue";
console.log("修改源数据,readonly的值也会受影响", info, rd);

可以看到,两者的值都被修改了:

在这里插入图片描述

三、shallowReactive

  • 与上一篇 ref 全家桶 中 shallowRef 十分相似,都是浅层的响应式
  • 修改第一层会触发视图更新,修改深层 不会触发视图更新
  • 有其他触发视图更新的操作,也会顺带将其更新

① reactive 是深层的响应式,视图会立刻更新

const obj2 = reactive({
  foo: {
    bar: {
      name: "xiaoman",
    },
  },
});
setTimeout(() => {
  obj2.foo.bar.name = "blue222222222";
}, 1000);

在这里插入图片描述

② shallowReactive 是浅层的响应式

const obj3 = shallowReactive({
  foo: {
    bar: {
      name: "xiaoman",
    },
  },
});

1、修改浅层才会触发响应式,会立刻更新:

setTimeout(() => {
  obj3.foo = {
    bar: {
      name: "小满",
    },
  };
}, 1000);

2、修改深层可以打印到新值,但视图不会立刻更新:

setTimeout(() => {
  // 修改深层不会触发更新
  obj3.foo.bar.name = "blue3333333333";
  console.log("obj3", obj3); // 打印成功,但是视图不会更新
}, 1000);

控制台:

在这里插入图片描述

视图:

在这里插入图片描述

3、会被其他有视图更新的操作,顺带着一起更新掉

setTimeout(() => {
  // 修改深层不会触发更新
  obj3.foo.bar.name = "blue3333333333";
  console.log("obj3", obj3);
  
  obj2.foo.bar.name = "blue555555"; // obj2 是 reactive,触发更新视图
}, 1000);

在这里插入图片描述

四、源码学习

主要关注 createReactiveObject 函数的逻辑

在这里插入图片描述
学习笔记:

/**
 *
 * 1、reactivity.d.ts中,关于 reactive 的类型定义:
 * 
 *    export declare function reactive<T extends object>(target: T): UnwrapNestedRefs<T>;
 *    
 * 	  其中 T extends object:即只能传入 object 的子类型
 * 
 * 2、reactivity.cjs.prod.js中,
 * 
 *      function reactive(target) {
          if (isReadonly(target)) {
            return target;
          }
        .....
        
 *      即:reactive 如果传入只读类型的,会直接返回
 *          
 *   3、createReactiveObject 函数中,
 *     - 若传入的不是 object 类型,会抛出警告(dev环境)并直接返回;
 *     - 若传入的是被 proxy 代理过的(并且不是为了将其变为只读),也会直接返回
 *     - 如果能从缓存中找到,则直接返回(weakMap)
 *     - 如果在白名单中,也会直接返回,例如 __skip__(后面会讲的 markRaw 处理过的会加一个 __skip__,会跳过proxy代理 )
 *     - 如果以上条件都没触发,就会进行 proxy代理
 *
 */

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

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

相关文章

W5500-EVB-PICO 做TCP Server进行回环测试(六)

前言 上一章我们用W5500-EVB-PICO开发板做TCP 客户端连接服务器进行数据回环测试&#xff0c;那么本章将用开发板做TCP服务器来进行数据回环测试。 TCP是什么&#xff1f;什么是TCP Server&#xff1f;能干什么&#xff1f; TCP (Transmission Control Protocol) 是一种面向连…

day7 8-牛客67道剑指offer-JZ74、57、58、73、61、62、64、65、把字符串转换成整数、数组中重复的数字

文章目录 1. JZ74 和为S的连续正数序列暴力解法滑动窗口&#xff08;双指针&#xff09; 2. JZ57 和为S的两个数字3. JZ58 左旋转字符串4. JZ73 翻转单词序列5. JZ61 扑克牌顺子6. JZ62 孩子们的游戏(圆圈中最后剩下的数)迭代 模拟递归 约瑟夫环问题 找规律 7. JZ64 求123...n8…

CH342/CH343/CH344/CH347/CH9101/CH9102/CH9103/CH9104 Linux串口驱动使用教程

CH343 Linux串口驱动 ch343ser_linux 支持USB转串口芯片 ch342/ch343/ch344/ch347/ch9101/ch9102/ch9103/ch9104等 &#xff0c;同时该驱动配合ch343_lib库还提供了芯片GPIO接口的读写功能&#xff0c;内部EEPROM的信息配置和读取功能等。 芯片型号串口数量GPIO数量CH342F/K2C…

【Linux命令行与Shell脚本编程】第十九章 正则表达式

Linux命令行与Shell脚本编程 第十九章 正则表达式 文章目录 Linux命令行与Shell脚本编程 第十九章 正则表达式九.正则表达式9.1.正则表达式基础9.1.1.正则表达式的类型9.2.定义BRE模式9.2.1.普通文本9.2.2.特殊字符 9.2.3.锚点字符锚定行首^锚定行尾$组合锚点 9.2.4.点号字符\.…

全栈开发流程——数据表的分析与创建详解实战演示(一)

作者介绍 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&…

【Linux】UDP协议——传输层

目录 传输层 再谈端口号 端口号范围划分 认识知名端口号 两个问题 netstat与iostat pidof UDP协议 UDP协议格式 UDP协议的特点 面向数据报 UDP的缓冲区 UDP使用注意事项 基于UDP的应用层协议 传输层 在学习HTTP等应用层协议时&#xff0c;为了便于理解&#xff…

Al Go: 蒙特卡洛树搜索(MCTS)简介

目录 1. 前言 1.1 Minimax 1.2 剪枝 1.3 蒙特卡洛树搜索 1.4 为什么随机走子会可行呢&#xff1f; 2. vanilla Monte Carlo tree search 3. UCT-based trade-off between exploitation and exploration 4. MCTS基本算法流程 5. Efficiency Through Expert Policies 6…

Spring整合MyBatis(详细步骤)

Spring与Mybatis的整合&#xff0c;大体需要做两件事&#xff0c; 第一件事是:Spring要管理MyBatis中的SqlSessionFactory 第二件事是:Spring要管理Mapper接口的扫描 具体的步骤为: 步骤1:项目中导入整合需要的jar包 <dependency><!--Spring操作数据库需要该jar包…

【雕爷学编程】Arduino动手做(04)---震动模块之常闭型SW-420传感器与SW-520D倾斜模块的应用

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

使用 Python 中的 Langchain 从零到高级快速进行工程

大型语言模型 (LLM) 的一个重要方面是这些模型用于学习的参数数量。模型拥有的参数越多,它就能更好地理解单词和短语之间的关系。这意味着具有数十亿个参数的模型有能力生成各种创造性的文本格式,并以信息丰富的方式回答开放式和挑战性的问题。 ChatGPT 等法学硕士利用 T

代码质量检查工具SonarQube

Devops流水线之SonarQube 文章目录 Devops流水线之SonarQube1. 软件功能介绍及用途2. 软件环境搭建与使用2.1 使用方法2.2 SonarQube相关属性说明2.3 Sonar配置文件内容说明 3. 使用环节4. 检查方法 1. 软件功能介绍及用途 SonarQube是一个用于代码质量管理的开源平台&#xf…

一百四十九、Kettle——Linux上安装的kettle8.2创建共享资源库时遇到的问题(持续更新中)

一、目的 在kettle8.2在Linux上安装好可以启动界面、并且可以连接MySQL、Hive、ClickHouse等数据库后开始创建共享资源库&#xff0c;但是遇到了一些问题 二、Linux系统以及kettle版本 &#xff08;一&#xff09;Linux&#xff1a;CentOS 7 英文的图形化界面模式 &#…

竞赛项目 深度学习的水果识别 opencv python

文章目录 0 前言2 开发简介3 识别原理3.1 传统图像识别原理3.2 深度学习水果识别 4 数据集5 部分关键代码5.1 处理训练集的数据结构5.2 模型网络结构5.3 训练模型 6 识别效果7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习…

无涯教程-Perl - index函数

描述 此函数返回STR中第一次出现的SUBSTR的位置,该位置从开头(从零开始)开始,或者从POSITION(如果指定)开始。 语法 以下是此函数的简单语法- index STR, SUBSTR, POSITIONindex STR, SUBSTR返回值 失败时此函数返回-1,否则返回匹配字符串的位置(第一个字符从零开始)。 例…

Mongoose http server 例子

今天抽了点时间看了一下 mongoose的源码&#xff0c; github 地址&#xff0c;发现跟以前公司内部使用的不太一样&#xff0c;这里正好利用其 http server 例子来看一下。以前的 http message 结构体是这样的&#xff1a; /* HTTP message */ struct http_message {struct mg_…

进程的退出

进程的退出分为正常退出和异常退出&#xff1a; 正常退出 Main函数调用return进程调用exit()&#xff0c;标准c库进程调用_exit()或_Exit()&#xff0c;属于系统调用进程最后一个线程返回&#xff08;之后学到&#xff09;最后一个线程调用pthread_exit&#xff08;之后学到&…

MySQL事务:ACID特性实现原理

事务是MySQL等关系型数据库区别于NoSQL的重要方面&#xff0c;是保证数据一致性的重要手段。本文将首先介绍MySQL事务相关的基础概念&#xff0c;然后介绍事务的ACID特性&#xff0c;并分析其实现原理。 MySQL博大精深&#xff0c;文章疏漏之处在所难免&#xff0c;欢迎批评指…

基于Elman神经网络的电力负荷预测

1 案例背景 1.1 Elman神经网络概述 根据神经网络运行过程中的信息流向,可将神经网络可分为前馈式和反馈式两种基本类型。前馈式网络通过引入隐藏层以及非线性转移函数可以实现复杂的非线性映射功能。但前馈式网络的输出仅由当前输人和权矩阵决定,而与网络先前的输出结果无关。…

Postman中,既想传递文件,还想传递多个参数(后端)

需求:既想传文件又想传多个参数可以用以下方式实现

2023年的深度学习入门指南(25) - 通义千问7b

2023年的深度学习入门指南(25) - 通义千问7b 最近发生的两件事情都比较有意思&#xff0c;一个是连续开源了7b和13b模型的百川&#xff0c;对其53b闭源了&#xff1b;另一个是闭源项目通义千问开源了自己的7b模型。 下面我们就来研究下通义千问7b. 使用通义千问7b 首先安装…