shallowReactive 与 shallowRef

除了之前的  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.mzph.cn/web/51157.shtml

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

相关文章

Spring Boot整合Sentry

Spring Boot整合Sentry Sentry搭建Sentry中新建项目集成SpringBoot1. 添加依赖2. 配置Sentry4. 日志集成&#xff08;可选&#xff09;5. 测试Sentry集成6. 配置实时告警配置Alert Settings配置警报规则 发送消息服务代码参照文档 Sentry 是一个日志平台&#xff0c;分为客户端…

CMakeLists.txt模板

#设置编译该CMakeLists.txt文件所需要的最低cmake版本 CMAKE_MINIMUM_REQUIRED(VERSION 最低版本号)# 该项目名称 PROJECT(项目名称)SET(CMAKE_CXX_STANDARD 11)SET(CMAKE_C_STANDARD 11)# 此行可以理解为将路径下所有的文件装载到自定义集合filelist中 FILE(GLOB filelist &q…

Vite + Vue 3 项目中实现路由自动化完整步骤。

下面是从创建项目到实现路由自动化的完整步骤 在 Vite Vue 3 项目中实现路由自动化可以通过使用文件系统路由生成器来简化路由管理过程。以下是实现路由自动化的完整步骤&#xff1a; 1.创建 Vite Vue 3 项目 如果你还没有一个 Vite Vue 3 项目&#xff0c;可以使用以下命令…

利用MongoDB进行数据治理,防范构建生成式AI应用程序时的潜在安全风险

生成式人工智能&#xff08;生成式AI&#xff09;正在蓬勃发展&#xff0c;许多企业和初创公司正在运用AI工具来解决各自的用例问题。随着企业逐渐适应市场上的新技术范式转移&#xff0c;开发者社区和开源模型也在不断发展壮大。 构建智能生成式AI应用程序需要灵活运用数据。…

基础算法--高精度数据(1)

高精度数据处理一般内容简单&#xff0c;写代码难度较大&#xff0c;可能部分内容涉及基础数学、初等数论等知识。请小心食用。不过本节不会给大家太难的高精度处理&#xff0c;我们第一次接触&#xff0c;不能劝退大家对吧。 高精度算法是指&#xff0c;利用基础或高级的数学…

盘古信息IMS MCM制造协同管理系统:为中小企业数字化转型量身打造的数字化方案

近年来&#xff0c;全球经济的不稳定性&#xff0c;给中小企业的经营和发展带来了巨大的挑战。为提升企业竞争力&#xff0c;中小企业纷纷谋求数字化转型路径&#xff0c;优化生产流程、提高运营效率、降低生产成本&#xff0c;以应对变幻莫测的市场环境。IMS MCM是盘古信息为广…

进阶-4.视图、存储过程、存储函数、触发器

视图、存储过程、存储函数、触发器 1.视图1.1 介绍1.2 语法1.3 视图的检查选项1.4 视图的更新1.5 视图作用1.6 案例 2.存储过程21. 介绍2.2 特点2.3 语法2.4 变量2.4.1 系统变量2.4.2用户自定义变量2.4.3 局部变量 2.5参数2.6条件语句2.6.1 if 语法2.6.2 case 2.7循环结构2.7.1…

通过IDEA创建spring boot的web项目

1.Fle->New->Project,选择Maven&#xff0c;点击Next 2.修改项目名称&#xff0c;点击Finish 3.项目创建完毕&#xff0c;等待Maven下载完成 4.修改pom.xml文件&#xff0c;改成如下内容 <?xml version"1.0" encoding"UTF-8"?> <pr…

增强管道数据流转(EPDR)技术的设计局限和替代

在前文中&#xff0c;我们介绍了EPDR技术的起源&#xff0c;以及使用该技术驱动的业余软件无线电平台专栏。已有玩家通过踩坑证明&#xff0c;进程管道交换数据时间延迟大&#xff0c;构造时间敏感系统难。除非采用传统的紧耦合设计及更大的颗粒度&#xff0c;否则很难在期望的…

Openstack 与 Ceph集群搭建(中): Ceph部署

文章目录 一、部署前说明1. ceph 版本选择依据2. ceph网络要求3. 硬件要求 二、部署架构三、部署过程1. 通用步骤2. 部署管理节点创建账号安装Cephadm运行bootstrap 3. 登录Ceph web4. 将其他节点加入集群同步ceph key安装ceph CLI命令行添加主机节点到集群添加OSD节点将监控节…

【Canvas与艺术】环形橄榄枝纹饰

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>环形橄榄枝(draft2)</title><style type"text/css&quo…

安卓蓝牙日志的获取方法

有过蓝牙调试经历的同学们可能都知道&#xff0c;在安卓系统中&#xff0c;在手机的设置–>开发人员页面下有一个开启蓝牙HCI信息收集日志选项开关&#xff0c;如下图中标红处&#xff0c; 打开该开关&#xff0c;就可以收集本机发送和接收的蓝牙HCI包。蓝牙包的数据会保存在…

git提交本地项目到远程仓库

1、查看项目目录&#xff0c;是否存在.git文件夹&#xff08;若存在则删除&#xff09; 2、登录git并新建一个空白项目 3、idea创建本地git仓库&#xff08;选择本地项目&#xff09; 4、添加要提交的项目&#xff08;项目右键&#xff09; 5、提交代码到本地仓库 6、配置远程…

轻松实现微服务间的无缝通信:OpenFeign入门指南

OpenFeign 前言1、导入依赖2、开启feign调用3、编写OpenFeign客户端4、Fegin接口实现5、Feign接口调用 前言 Spring Cloud OpenFeign是一种基于Spring Cloud的声明式REST客户端&#xff0c;它简化了与HTTP服务交互的过程。它将REST客户端的定义转化为Java接口&#xff0c;并且…

css 宫格样式内容上下结构

结构 <div class"sc-content-group"><div class"sc-content-item"><div class"sc-item-img"><el-image :src"src" :preview-src-list"[src]"></el-image></div><div class"s…

datax关于postsql数据增量迁移的问题

看官方文档是不支持的 数据源及同步方案_大数据开发治理平台 DataWorks(DataWorks)-阿里云帮助中心 (aliyun.com) 看了下源码有个postsqlwriter 看了下也就拼接sql 将 PostgresqlWriter中的不允许更新先注释了 让他过去先 然后看到 WriterUtil中的对应方法 getWriteTemplat…

咸鱼之王手游内购修复无bug运营版联网架设+后台

今天给大家带来一款单机游戏的架设&#xff1a;咸鱼之王手游。 另外&#xff1a;本人承接各种游戏架设&#xff08;单机联网&#xff09; 本人为了学习和研究软件内含的设计思想和原理&#xff0c;带了架设教程仅供娱乐。 教程是本人亲自搭建成功的&#xff0c;绝对是完整可…

【代码随想录训练营第42期 Day38打卡 - 动态规划Part6 - LeetCode 322. 零钱兑换 279.完全平方数 139.单词拆分

目录 一、做题心得 二、题目与题解 题目一&#xff1a;322. 零钱兑换 题目链接 题解&#xff1a;动态规划--完全背包 题目二&#xff1a; 279.完全平方数 题目链接 题解&#xff1a;动态规划--完全背包 题目三&#xff1a;139.单词拆分 题目链接 题解&#xff1a;动…

qt-16可扩展对话框--隐藏和展现

可扩展对话框 知识点extension.hextension.cppmain.cpp运行图初始化隐藏展现--点击--详细按钮 知识点 MainLayout->setSizeConstraint(QLayout::SetFixedSize);//固定窗口大小 extension.h #ifndef EXTENSION_H #define EXTENSION_H#include <QDialog>class Extens…

你是如何更精准地指引模型,激发其无尽的创造力?

随着大型语言模型日益凸显其重要性&#xff0c;发掘并充分利用它们的潜力&#xff0c;很大程度上依赖于我们如何巧妙构思和构造指令——即Prompt的精炼艺术。优化Prompt撰写技巧&#xff0c;将能够更好地引导大模型&#xff0c;为各类应用场景生成高质量的文本输出。分享出你的…