Vue3中shallowRef和ref区别

ops/2024/9/22 20:17:58/

在 Vue 3 中,ref 和 shallowRef 都是用来创建响应式引用的工具,但它们之间存在一些关键的区别,主要在于它们如何处理对象的响应式特性。

ref

ref 创建的是一个完整的响应式引用,它不仅使基础值成为响应式的,而且当值是一个对象时,它还会递归地将对象的所有属性变为响应式的。这意味着如果你有一个复杂的对象结构,使用 ref 将会使整个对象树都变成响应式的。

优点
  • 对象内的所有层级都是响应式的。
  • 更适合用于需要完整响应式支持的场景。
缺点
  • 对于大型对象,可能会导致性能问题,因为 Vue 需要追踪对象内部所有的变化。
  • 初始化时需要更多的时间来设置响应式属性。

shallowRef

shallowRef 创建了一个浅层响应式的引用。它只使引用的基础值成为响应式的,而不深入对象内部使其属性也变为响应式的。也就是说,当你使用 shallowRef 包装一个对象时,只有这个对象本身是响应式的,对象内部的属性不是响应式的。

优点
  • 性能更好,尤其是在处理大型对象时,因为它不需要追踪对象内部的变化。
  • 初始化速度更快,因为它不需要递归地设置对象的响应式属性。
缺点
  • 对象内部的属性不是响应式的,这可能不适合某些需要深层响应式特性的场景。

使用场景

  • 当你需要一个完整的响应式对象,包括它的所有属性和嵌套属性时,应该使用 ref
  • 当你只需要跟踪对象本身的引用变化,而不是对象内部属性的变化时,可以使用 shallowRef
javascript">import { ref, shallowRef } from 'vue';// 使用 ref
const user = ref({ name: 'Alice', age: 25 });
user.value.name = 'Bob'; // 触发响应式更新// 使用 shallowRef
const userShallow = shallowRef({ name: 'Alice', age: 25 });
userShallow.value.name = 'Bob'; // 不触发响应式更新
userShallow.value = { name: 'Charlie', age: 30 }; // 触发响应式更新// 如果需要使 shallowRef 内部的对象也具有响应式,可以使用 reactive
import { reactive } from 'vue';
const userShallowReactive = shallowRef(reactive({ name: 'Alice', age: 25 }));
userShallowReactive.value.name = 'Bob'; // 触发响应式更新

在这个例子中,ref 使得 user 对象内的 name 属性更改时能够触发响应式更新,而 shallowRef 则不会。不过,如果你确实需要让 shallowRef 包装的对象内部也是响应式的,可以结合使用 reactive 来达到目的。


http://www.ppmy.cn/ops/114403.html

相关文章

大学生涯规划

记得大学刚开学老师布置的作业就是写自己的职业生涯规划,但是直到大学毕业我也不知道有什么规划,很迷茫,虽然经常去图书馆看书,前端、后端、C#、JAVA等东一棍西一棒,但是实际上实战经验很少,知识基本也没运…

食品检测与分类系统源码分享

食品检测与分类检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

在Python中快速获取HTML中<span>标签的内容

在Python中&#xff0c;要获取HTML中<span>标签的内容&#xff0c;通常我们会使用像BeautifulSoup这样的库&#xff0c;它提供了方便的方法来解析HTML和XML文件&#xff0c;并从中提取数据。下面是一个使用BeautifulSoup来获取<span>标签内容的简单示例。 首先&am…

前后端分离,使用MOCK进行数据模拟开发,让前端攻城师独立于后端进行开发

mock是什么 Mock生成随机数据,拦截Ajax 请求&#xff0c;前后端分离&#xff0c;让前端攻城师独立于后端进行开发。 增加单元测试的真实性 通过随机数据,模拟各种场景。 在实际开发过程中&#xff0c;前端是通过axios来请求数据的&#xff0c;很多时候前端开发者就是通过写固定…

茴香豆的茴的写法-SpringBoot处理客户端请求的几种方式

方式1&#xff1a;Controller或者RestController /*** 方式1&#xff1a;Controller* */ RestController public class AtController {GetMapping("/at")public String at() {return "Controller";} }方式2&#xff1a;Component Controller接口 /*** 方…

【devops】devops-ansible之介绍和基础使用

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

通过 Docker 部署 WordPress 服务器

今天我在三丰云的免费服务器上进行了一次WordPress的部署测试。说实话&#xff0c;这是一款不错的免费服务器&#xff0c;配置也非常合理——1核CPU、1G内存、10G硬盘和5M带宽&#xff0c;完全可以满足小型网站的需求。三丰云的稳定性和易用性让我感到惊喜&#xff0c;真的是想…

零信任安全架构--持续验证

随着网络安全威胁的不断演变&#xff0c;传统的“信任但验证”安全模式已无法应对现代复杂的攻击。零信任安全架构&#xff08;Zero Trust Architecture, ZTA&#xff09;应运而生&#xff0c;作为一种全新的安全理念&#xff0c;它彻底改变了企业的网络安全防护方式。核心思想…