shallowReactive 与 shallowRef

news2024/11/14 7:19:28

除了之前的  ref与reactive  之外,Vue3 还准备了另外两个API,也是用来对响应式数据做处理,那就是 shallowReactive 与 shallowRef

shallowReactive

文档解释:reactive() 的浅层作用形式,只能定义对象类型的数据。和 reactive() 不同,这里没有深层级的转换:一个浅层响应式对象里只有根级别的属性是响应式的。属性的值会被原样存储和暴露,这也意味着值为 ref 的属性不会被自动解包了。

也就是说,shallowReactive 定义的响应式数据,只有第一层数据是响应式的,嵌套的数据则不会被转化为响应式。

<template>
  <button @click="person.age++">年龄+1</button>
  <button @click="person.job.j1.salary++">薪资+1</button>
  <button @click="person.arr[0]++">arr数组第一个值+1</button>
  <p>{{ person }}</p>
</template>


let person = shallowReactive({
  name: "al",
  age: 28,
  job: {
    j1: {
      work: "前端",
      salary: 2,
    },
  },
  arr:[1,2,3]
});

 

经过测试发现,只有 age 发生了改变,嵌套的数据 job 以及 数组 arr 都没有改变。这就说明了只有第一层数据,且第一层数据的值为简单类型时才会被转化成响应式。若值为对象或数组等复杂类型,则不会被转化为响应式。

但是我们还是可以 通过  替换  的方式来改变 job 或 arr 等复杂类型数据

<template>
  <button @click="person.job = {msg:'job被改变了'}">job被替换了</button>
  <button @click="person.arr = [4,5,6]">arr被替换了</button>
  <p>{{ person }}</p>
</template>

 

shallowRef

文档解释:ref() 的浅层作用形式。和 ref() 不同,浅层 ref 的内部值将会原样存储和暴露,并且不会被深层递归地转为响应式。只有对 .value 的访问是响应式的。

首先 ref 是可以接收基础类型数据和对象类型数据的,shallowRef  也能接收同样类型的数据,但是 shallowRef 只会对基础类型数据进行转化,对于复杂类型则不会被转化为响应式。

还是上面的例子,我们通过 shallowRef 来转化,先打印一下转化后的person对象

person 还是一个ref 对象,但是其中的 value 已经不是Proxy代理对象了,而是一个普通对象,也就是说 shallowRef 无法将对象转化为响应式数据。

验证一下:

我们依次点击按钮,发现数据完全没有发生改变,这就证明了 shallowRef 无法将对象转化为响应式数据。

既然  shallowRef 无法将对象转化为响应式数据。那么 对于普通类型的数据 shallowRef  会怎么处理呢?

<template>
  <button @click="sum++">sum+1</button>
  <p>{{ sum }}</p>
</template>

let sum = shallowRef(0) 

打印一下 sum ,我们发现 sum是一个 ref 对象,其中的 value 则是响应式数据

经过测试 sum 确实真的是响应式数据

说明  shallowRef  是能将基础类型数据转化为响应式的。

总结

  1. shallowReactive:只处理对象最外层属性的响应式(浅响应式)
  2. shallowReactive 中说 属性的值会被原样存储和暴露:Vue 只会对对象的顶层属性进行响应式处理,嵌套在内部的对象或数组保持原始状态,不会被转化为响应式。当访问或修改这些嵌套属性时,Vue 不会跟踪这些变化,也不会触发响应式更新
    • ​​原样存储:当你使用 shallowReactive 创建一个浅层响应式对象时,Vue 只会对这个对象的顶层属性进行响应式处理,数组或嵌套在内部的对象将不会被自动转换为响应式对象。Vue 不会递归地深入处理嵌套属性,这些嵌套属性保留为原始的(未处理过的)非响应式数据。
    • 原样暴露:在访问 shallowReactive 对象时,顶层属性是响应式的,你可以直接访问它们,且修改这些属性会触发 Vue 的响应式更新机制。但当你访问或修改嵌套属性时,这些嵌套属性依旧是原始的非响应式数据,Vue 不会跟踪它们的变化。

  3. shallowRef:只处理基本数据类型的响应式, 不进行对象的响应式处理
  4. shallowRef 说 内部值将会原样存储和暴露:shallowRef 对象中的值不会被 Vue 的响应式系统处理为响应式的嵌套对象,而是直接存储并在访问时原样提供。仅顶层的对象引用会受到响应式系统的追踪,而嵌套的属性或对象则不会,
    • ​​​​​​​原样存储shallowRef 内部存储的值是原始的、未经过任何响应式处理的。这意味着当你把一个对象传递给 shallowRef 时,这个对象本身不会被转换为响应式对象,只有这个对象作为整体的引用会被响应式跟踪。
    • 原样暴露:当你访问 shallowRef 的值时,你得到的仍然是这个原始的、未经过处理的对象。你可以直接访问和操作这个对象的属性,但这些属性的更改不会触发 Vue 的响应式系统。

  5. 使用情况:

    • shallowRef 性能优化:当你有一个非常复杂的对象结构,并且你只关心这个对象整体的变化,而不关心它内部细节的变化时,使用 shallowRef 可以减少 Vue 的响应式开销。

    • 第三方库集成:当你需要将 Vue 的响应式系统与某些外部库的对象(比如大型数据结构或库自带的对象)集成,而这些对象不需要深层次的响应式支持时,shallowRef 是理想的选择。

    • shallowReactive 性能优化:当你只关心对象的顶层属性变化,而不需要深入嵌套属性的响应式支持时,shallowReactive 可以减少 Vue 的响应式处理开销。

    • 处理复杂数据结构:当你处理的对象结构较为复杂(如嵌套很深或包含大量数据)且你希望避免 Vue 对整个数据结构进行递归响应式处理时,shallowReactive 提供了对响应式控制的更大灵活性。

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

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

相关文章

pytorh基础知识和函数的学习:图像文件的Tensor

在深度学习和计算机视觉中&#xff0c;将图像文件转换为张量&#xff08;Tensor&#xff09;是数据预处理的重要步骤。Tensor 是一种多维数组&#xff0c;在 PyTorch 中&#xff0c;用于表示和处理数据。 首先&#xff0c;创建一个3*3的图像文件&#xff0c;放大之后&#xff…

终端防火墙软件功能 | 在终端设备上启用防火墙!终端安全小课堂开讲啦

终端设备的安全性直接关系到企业的整体网络安全&#xff0c;随着网络威胁的日益复杂和多样化&#xff0c;启用并合理配置终端防火墙软件是保障终端安全不可或缺的一环。 今天&#xff0c;我们将走进终端安全小课堂&#xff0c;详细解析安企神终端安全管理软件中的防火墙功能&a…

unity Android + WebGL 浏览器打开

1.切换为WebGL平台 2.打包的时候设置 3.放入FHS 手机打开这个链接即可 注意这是在局域网内

c++11异常

一、异常介绍 1、异常作用 异常是一种处理错误的方式&#xff0c;当一个函数发现自己无法处理的错误时就可以抛出异常&#xff0c;让函数的 直接或间接的调用者处理这个错误 2、异常操作 &#xff08;1&#xff09;throw 当问题出现时&#xff0c;程序会抛出一个异常。这是…

darnet 识别检测本地视频 保存本地视频

darnet 识别检测本地视频 保存本地视频 darknet的github下载 darknet的github下载 darknet地址 将这个下载后&#xff0c;保存在catkin_ws的src目录下

C语言 ——— 柔性数组

目录 柔性数组的概念以及定义 柔性数组的特点 柔性数组的使用 柔性数组的概念以及定义 概念&#xff1a; C99中&#xff0c;结构中的最后一个元素允许是未知大小的数组&#xff0c;这就叫柔性数组成员 定义&#xff1a; struct st_type {int i;int a[0]; //柔性数组成员…

rpmbuild构建mysql-boost-5.7.42版本的rpm包

系列文章目录 rpmbuild入门 文章目录 系列文章目录前言一、准备工作1、mysql-5.7.42源码包下载2、准备mycnf配置文件3、mysqld.server配置文件准备4、检查服务器的cmake版本和gcc版本5、服务器安装依赖 二、编译构建0、rpmbuild目录树示例1、spec文件拆分解释2、源码包解压部分…

秋招力扣Hot100刷题总结——堆

1. 数组中的第K个最大元素 题目链接 题目要求&#xff1a;给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) …

使用Jupyter Notebook实现Python编程

目录 1. 安装Anaconda 2. 启动Jupyter Notebook 3. 调试Python代码: 4. 定义一个简单的python类 ​5. 在控制台运行代码,并从命令行接受参数 6. 调用其他py文件中的类 ​7. conda环境切换和迁移 1. 安装Anaconda 到Anaconda官网下载安装包:Download Anaconda Distri…

Android - lock/unlock bootloader

在执行 adb remount 时高版本经常会提示失败 此时就需要对设备的进行解锁操作。记录两个部分&#xff0c;Google解锁和展锐解锁。 目录 一、Google解锁 二、展锐解锁 三、补充跳过按键检测的方案 一、Google解锁 官网介绍的unlock方法如下&#xff1a;锁定/解锁引导加载程序…

并发编程与并发安全

持续更新中 模块序号目录链接前言介绍1前言地址2介绍地址基础知识3计算机网络地址4操作系统地址5Java基础地址6Java并发地址7Java虚拟机地址中间件8Mysql地址9Redis地址10Elasticsearch地址11RabbitMQ地址12RocketMQ地址框架13分布式系统地址14MyBatis地址15Dubbo地址16Spring地…

Java面试题--JVM大厂篇之JVM 大厂面试题及答案解析(3)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到我的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而我的博客&…

如何使用ssm实现基于HTML5的出租车管理系统

TOC ssm126基于HTML5的出租车管理系统jsp 绪论 1.1 选题背景 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。计算机软件可以针对不同行业的营业特点以…

【数据结构5】二叉搜索树(插入、查询、删除)

1 二叉搜索树 1.1 二叉搜索树-插入 1.2 二叉搜索树-查询 1.3 二叉搜索树-删除 1 二叉搜索树 二叉搜索树是一颗二叉树且满足性质:设是二叉树的一个节点。 如果y是x左子树的一个节点&#xff0c;那么y.key< x.key;如果y是x右子树的一个节点&#xff0c;那么y.key > x.key。…

【非常困难】 猿人学web第一届 第10题 js 混淆 - 重放攻击对抗

文章目录 调试干扰第一个 debuggerHook 代码 第二个 debuggerHook 代码 第三个 Function.constructor.prototype 检测Hook 代码 完整的 Hook 代码 接口分析加密参数 m 生成位置加密参数还原加密点扣代码提示_yrxyA\$()var _yrxmEu _yrxWKg(_yrxyHJ...._yrxWKg() let result _…

命令执行漏洞-rce

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 1.1 命令执行漏…

47.x86游戏实战-VEHHOOK封包函数

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

Aiseesoft Mac Video Converter Ultimate:高效多能的视频转换与编辑工具

Aiseesoft Mac Video Converter Ultimate是一款视频转换与编辑软件&#xff0c;以其强大的功能和简单易用的操作界面赢得了广泛好评。该软件不仅支持多种视频格式的转换&#xff0c;还集成了丰富的视频编辑功能&#xff0c;满足了用户多样化的视频处理需求。 核心功能概述 视频…

mysqlcheck

mysql bin中的其他工具包 对于mysql的其他工具, 有很多选项是公共的, 例如你在对数据库进行检查的时候, 需要指定host和user以及其password来连接上mysqlserver来进行相关操作, 这个时候其实用到的host等东西跟我们之前的mysql-client其实是类似的 也就是说他们是作为mysql众…

顺序表的顺序表示—动态分配

顺序表的顺序表示—动态分配 代码实现 #include <stdio.h> #include <stdlib.h> #define InitSize 15 // 初始化扩容长度typedef struct{int *data; // 动态分配数组的指针int MaxSize;int length; // 当前长度 }SeqList;void InitList(SeqList &L){// 申请一…