当前位置: 首页 > article >正文

Vue3中shallowRef和ref区别

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

ref

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

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

shallowRef

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

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

使用场景

  • 当你需要一个完整的响应式对象,包括它的所有属性和嵌套属性时,应该使用 ref
  • 当你只需要跟踪对象本身的引用变化,而不是对象内部属性的变化时,可以使用 shallowRef
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.kler.cn/news/315247.html

相关文章:

  • 确保在AWS上的资源安全:构建坚不可摧的云安全防线
  • C++ prime plus-2-编程练习
  • 解决 Torch not compiled with CUDA enabled 问题 | MiniCPM3-4B 【应用开发笔记】
  • Android 短信验证码自动填充
  • Unity 设计模式 之 创建型模式 -【单例模式】【原型模式】 【建造者模式】
  • 【力扣】2376. 统计特殊整数
  • Linux:虚拟文件系统/proc和self进程
  • 某招标公告公示搜索引擎爬虫逆向
  • git配置SSH
  • 第二届Apache Flink极客挑战赛冠军比赛攻略_SkyPeaceLL队
  • 安卓开发,插件化换肤思路
  • 【Java】接口interface【主线学习笔记】
  • Mac使用gradle编译springboot-2.7.x源码
  • Hadoop分布式集群配置
  • SIP Servlets学习
  • ModbusTCP报文详解
  • 冒泡排序,选择排序,插入排序,归并排序,快速排序五种排序方法
  • thop计算模型复杂度(params,flops)
  • 云计算实训50——Kubernetes基础命令、常用指令
  • 怎样把PPT上顽固的图标删了
  • Html css水平居中+垂直居中+水平垂直居中的方法总结
  • WPF 自定义路由事件
  • HTTP的基本格式
  • 整合多方大佬博客以及视频 一文读懂 servlet
  • go/函数
  • Java笔试面试题AI答之单元测试JUnit(5)
  • 3. 什么是连接池?为什么使用数据库连接池?
  • AgentScope中带有@功能的多Agent组对话
  • Github Wiki 超链接 转 码云Gitee Wiki 超链接
  • hcia-openEuler V1.0师资题库-试卷2