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

Vue3中对比ref,reactive,shallowRef,shallowReactive

对比ref,reactive,shallowRef,shallowReactive

1. 响应性的深度

API响应性范围适用场景
ref深层响应(基本类型/对象的所有层级)基本类型数据,或需要深层响应的对象/数组
reactive深层响应(对象/数组的所有层级)需要深层响应的复杂对象/数组(如嵌套对象)
shallowRef浅层响应(仅 .value 本身,不处理内部对象)大型对象/第三方库实例(避免深层代理的性能开销)
shallowReactive浅层响应(仅对象第一层属性,不处理嵌套对象)只需第一层属性响应的对象(如表单的简单字段)

2. 详细对比与示例

(1)ref vs shallowRef
  • ref:对基本类型会创建响应式包装;对对象类型,会自动用 reactive 包装,实现深层响应

    import { ref } from 'vue'const data = ref({ name: 'Alice', info: { age: 20 } })// 修改深层属性,会触发响应式更新
    data.value.info.age = 21  // ✅ 视图会更新
    
  • shallowRef:只跟踪 .value引用变化,不处理内部对象的响应式(即对象内部属性变化不会触发更新)。

    import { shallowRef } from 'vue'const data = shallowRef({ name: 'Alice', info: { age: 20 } })// 修改深层属性,不会触发更新
    data.value.info.age = 21  // ❌ 视图不更新// 只有替换整个 .value 才会触发更新
    data.value = { ...data.value, info: { age: 21 } }  // ✅ 视图会更新
    
(2)reactive vs shallowReactive
  • reactive:会递归将对象的所有层级属性转为响应式,深层属性变化会触发更新。

    import { reactive } from 'vue'const user = reactive({name: 'Alice',info: { age: 20 }
    })// 修改深层属性,会触发更新
    user.info.age = 21  // ✅ 视图会更新
    
  • shallowReactive:只处理对象的第一层属性,嵌套对象的变化不会触发响应式更新。

    import { shallowReactive } from 'vue'const user = shallowReactive({name: 'Alice',info: { age: 20 }  // 嵌套对象不会被转为响应式
    })// 修改第一层属性,会触发更新
    user.name = 'Bob'  // ✅ 视图会更新// 修改深层属性,不会触发更新
    user.info.age = 21  // ❌ 视图不更新
    

使用浅层响应式

浅层响应式 API(shallowRef/shallowReactive)的核心价值是性能优化,适用于以下场景:

  • 处理大型对象(如后端返回的复杂数据),避免深层代理带来的性能开销;
  • 操作第三方库实例(如 Chart.js、地图库对象),这些对象不需要响应式,且深层代理可能导致异常;
  • 明确只需要第一层属性响应的场景(如简单表单),减少不必要的响应式追踪。

总结

场景需求推荐 API
基本类型 + 深层响应ref
复杂对象 + 深层响应reactive
大型对象/第三方实例 + 浅层响应shallowRef
简单对象 + 仅第一层响应shallowReactive

浅层响应式不会递归处理嵌套数据,使用时需手动管理深层变化的响应性(如通过替换整个对象引用)

http://www.dtcms.com/a/389844.html

相关文章:

  • 通过Freemark渲染数据到Word里并生成压缩包
  • Vue 项目中使用 AbortController:解决请求取消、超时与内存泄漏问题
  • 设置管家婆服务器开机自动启动
  • ubuntu20 安装 ros2 foxy
  • 二分查找(二分查找算法)
  • 贪心算法应用:超图匹配问题详解
  • Hadoop3.3.5搭建指南(双NN版本)
  • 如何正确写Controller?参数校验、异常处理
  • 线性代数:LU与Cholesky分解
  • 饮用水在线监测设备:实时、精准地捕捉水体中的关键参数,为供水安全提供全方位保障
  • 【环境搭建】Conda安装教程
  • Java与机器学习的结合:库与应用!
  • DHCP基本原理及实验(ENSP配置)
  • 高系分十一:软件需求工程
  • MCP Server Chart AntV 项目解析
  • 2025药物市场调研分析案例(模板资源分享)
  • 飞网出口网关:安全便捷地访问受限资源
  • 大模型训练的三大显存优化策略
  • 动态加载js链接、异步传参加载组件、有趣打印
  • 【Python】Python异常、模块与包
  • 第三方网站系统测试:【基于Pytest的自动化测试框架的测试】
  • 每个 SIwave 求解器的正确激励
  • 给 C++ Protobuf“装上 Abseil”版本确认、Bazel/CMake 实战与避坑
  • Java 大视界 -- Java 大数据在智能物流运输车辆智能调度与路径优化中的技术实现
  • 电脑中的32位和64位
  • 如何免费使用AWS服务器?AWS Free Tier免费套餐申请与避坑指南
  • QML界面调用C++层阻塞函数,如何不卡界面
  • JVM GC 调优:GC 问题发现工具,五大 GC 异常模式,四大调优方案与案例实战
  • Excel处理控件Aspose.Cells教程:如何使用Python在Excel中创建下拉列表
  • React 18.2中使用Redux 5.0.1