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

ref存储对象和reactive深度响应式递归地对对象的嵌套属性进行响应式处理

ref 不会递归地对 对象数组 中的每个属性或元素进行深度响应式处理。如果你需要递归处理嵌套属性,reactive 是更适合的选择。让我通过具体的例子来展示这一点。

例子:ref 存储对象和嵌套对象

1. 使用 ref 存储嵌套对象:
import { createApp, ref } from 'vue';createApp({setup() {// 使用 ref 存储对象,包含嵌套属性const user = ref({name: 'Alice',profile: {age: 25,address: 'New York'}});// 修改嵌套属性function updateUser() {user.value.profile.age = 26; // 修改嵌套对象的属性}return {user, // 返回 user 对象给模板updateUser};}
}).mount('#app');
模板部分:
<div id="app"><p>Name: {{ user.value.name }}</p><p>Age: {{ user.value.profile.age }}</p><button @click="updateUser">Update Age</button>
</div>
问题:

在这个例子中,ref 用于存储一个 对象,对象内有一个嵌套的 profile 对象。user.value.profile.age 是嵌套属性,它应该是响应式的。但问题在于,ref 不会递归地对嵌套对象进行响应式处理user.value.profile 并不是深度响应式的,而是浅响应式的。

这意味着,当你修改 user.value.profile.age 时,Vue 不会自动更新视图,因为 profile 对象没有被 深度响应式化

解决方法:

如果我们希望 profile 对象的嵌套属性(如 ageaddress)也能触发视图更新,我们需要通过 reactive 来深度响应式化这个对象。

2. 使用 reactive 存储嵌套对象:
import { createApp, reactive } from 'vue';createApp({setup() {// 使用 reactive 创建深度响应式对象const user = reactive({name: 'Alice',profile: {age: 25,address: 'New York'}});// 修改嵌套属性function updateUser() {user.profile.age = 26; // 修改嵌套对象的属性}return {user, // 返回 user 对象给模板updateUser};}
}).mount('#app');
模板部分:
<div id="app"><p>Name: {{ user.name }}</p><p>Age: {{ user.profile.age }}</p><button @click="updateUser">Update Age</button>
</div>
解释:
  • 在这个例子中,reactive 用来将 user 对象及其内部属性(如 profile)深度响应式化。
  • 现在,修改 user.profile.age 时,profile 对象age 属性 都是 深度响应式的,因此视图会自动更新。

总结:

  • ref 存储 对象数组 时,它只会 创建响应式引用不会递归地对对象的嵌套属性进行响应式处理。你需要使用 .value 来访问和修改对象的内容。如果对象有嵌套的属性,ref 无法保证它们是响应式的,除非显式地使用 reactive
  • reactive 会对 对象 及其所有 嵌套属性 进行深度响应式处理,无需使用 .value,并且修改嵌套属性时视图会自动更新。

何时使用 refreactive

  • ref 适用于 基本数据类型(如 numberstring)以及 简单的对象或数组,但你需要通过 .value 来访问和修改数据。
  • reactive 适用于 复杂数据类型(如 对象数组),并且会自动递归地将对象的每个属性都变成响应式。
http://www.dtcms.com/a/317514.html

相关文章:

  • 纯血鸿蒙(HarmonyOS NEXT)应用开发完全指南
  • Baumer相机如何通过YoloV8深度学习模型实现农作物水稻病虫害的检测识别(C#代码UI界面版)
  • 机器学习----随机森林(Random Forest)详解
  • MonoFusion 与 Genie 3
  • imx6ull-驱动开发篇10——pinctrl 子系统
  • Apollo中三种相机外参的可视化分析
  • ipv6学习
  • CVE-2020-24557
  • 【LayUI】数据表格监听事件
  • 界面规范的其他框架实现-列表-layui实现
  • 最新教程 | CentOS 7 下 MySQL 8 离线部署完整手册(含自动部署脚本)
  • 【后端】java 抽象类和接口的介绍和区别
  • PromptPilot 与豆包新模型:从图片到视频,解锁 AI 新玩法
  • 8.6笔记
  • JSON、JSONObject、JSONArray详细介绍及其应用方式
  • Day 33: 动手实现一个简单的 MLP
  • 如何快速掌握大数据技术?大四学生用Spark和Python构建直肠癌数据分析与可视化系统
  • 【python中级】关于Flask服务在同一系统里如何只被运行一次
  • DDoS 防护的未来趋势:AI 如何重塑安全行业?
  • 【历史人物】【范仲淹】简历与生平
  • 应急响应知识总结
  • 主流linux版本分类与说明
  • mysql死锁的常用解决办法
  • 【Linux系统】进程间通信:命名管道
  • Java SPI 机制初探|得物技术
  • linux下的串口通信原理及编程实例
  • 二、Envoy静态配置
  • 时序预测(论文解读)-金融领域的滞后性
  • 客流特征识别准确率提升 29%:陌讯多模态融合算法在零售场景的实战解析
  • 【渲染流水线】[应用阶段]-[遮挡剔除]以UnityURP为例