vue3 响应式 API:shallowRef()和shallowReactive()

shallowRef()

shallowRef()是一个用于创建浅层响应式引用的函数。它创建一个响应式数据,但只对顶层属性进行响应式处理。

特点: 只跟踪引用值的变化,不关心值内部的属性变化。

html 复制代码
<template>
  <div>{{ shallowRefObj }}</div>
  <button @click="changeShallowRefObj">直接修改shallowRefObj</button>
  <button @click="changeMessage">修改message属性</button>
</template>
<script setup lang="ts">
import { shallowRef } from 'vue';
const shallowRefObj = shallowRef({ 
  message: 'Hello' 
})

const changeShallowRefObj = () => {
  // 以下操作会触发响应式更新,因为直接修改了引用本身
  shallowRefObj.value = { message: 'hello World!' }
}

const changeMessage = () => {
  // 以下操作不会触发响应式更新,因为只是修改了引用对象的属性
  shallowRefObj.value.message = 'New message'
  console.log('执行changeMessage()后:', shallowRefObj)
}
</script>
  1. 执行changeShallowRefObj方法,修改shallowRefObj,触发响应式更新:
  2. 执行changeMessage 方法,修改shallowRefObjmessage属性,不会触发响应式更新。
  • 执行方法后,devtools查看setup里的数据、页面渲染结果如上图所示,shallowRefObjmessage属性值没有任何改变。
  • 查看console.log('执行changeMessage()后:', shallowRefObj)在控制台的打印结果:shallowRefObjmessage属性值已经被修改。

ref()的区别

  • ref()创建的是深度响应式引用,对引用对象的属性的修改也会触发响应式更新。
  • shallowRef()创建的浅层 ref 的内部值将会原样存储和暴露,并且不会被深层递归地转为响应式。只有对 .value 的访问是响应式的。

应用场景

shallowRef() 常常用于对大型数据结构的性能优化或是与外部的状态管理系统集成。

shallowReactive()

shallowReactive()是一个用于创建浅层响应式对象的函数。

shallowReactive()创建的响应式对象是浅层的:

  • 只有对象的直接属性是响应式的,对象内部的嵌套属性不是响应式的。
html 复制代码
<template>
   <div>{{ shallowReactiveObj }}</div>
   <button @click="changeMessage">修改message属性</button>
   <button @click="changeProperty">修改property属性</button>
</template>
<script setup lang="ts">
import { shallowReactive } from 'vue';
const shallowReactiveObj = shallowReactive({
  message: 'Hello',
  nestedObject: {
    property: 'value'
  }
});

const changeMessage = () => {
  // 以下操作会触发响应式更新,因为直接修改了浅层响应式对象的属性
  shallowReactiveObj.message = 'hello World!'
};

const changeProperty = () => {
  //  以下操作不会触发响应式更新,因为是修改嵌套对象的属性
  shallowReactiveObj.nestedObject.property = 'New Value';
  console.log('执行changeProperty()后:', shallowReactiveObj);
};
</script>
  1. 执行changeMessage方法,修改浅层响应式对象shallowReactiveObjmessage属性,触发响应式更新:
  1. 执行changeProperty方法,修改浅层响应式对象shallowReactiveObj 的嵌套属性property,不会触发响应式更新:
  • 执行方法后,devtools查看setup里的数据、页面渲染结果如上图,shallowReactiveObj的嵌套属性property没有任何改变。
  • 查看console.log('执行changeProperty()后:', shallowReactiveObj);在控制台的打印结果:shallowReactiveObj的嵌套属性property已经被修改。

reactive()的区别

  • reactive()创建的是深度响应式对象,对象的所有属性(包括嵌套对象的属性)都是响应式的。
  • shallowReactive()创建的浅层响应式对象里只有根级别的属性是响应式的。属性的值会被原样存储和暴露,这也意味着值为 ref 的属性不会被自动解包了。
相关推荐
梦帮科技5 小时前
GRAVIS v4.0:基于Web的极速套利架构设计与实时数据流实现
前端·人工智能·rust·自动化·区块链·智能合约·数字货币
爱勇宝5 小时前
办公资料反复修改、补传、交接混乱,我做了个桌面工具来解决这件事
前端·后端·程序员
微信开发api-视频号协议6 小时前
企业微信外部群开发自动化实践过程
java·前端·微信·自动化·企业微信·ipad
甲维斯6 小时前
Fable5:20美金的顶级设计师!
前端·人工智能
kyriewen6 小时前
我同时用了 Claude Code、Cursor 和 Codex,说说三个工具的真实差距——2026 年选错工具比不用 AI 更浪费时间
前端·ai编程·claude
Jackson__6 小时前
为了拯救我的腰椎和颈椎,我做了款浏览器插件!
前端·javascript·开源
闲猫7 小时前
Python FastAPI + SQLAlchemy 入门教程:从零搭建你的第一个 Web 应用
前端·python·fastapi
林小帅7 小时前
NestJS v11 + Prisma v7 ESM 迁移配置解析
前端·javascript·后端
IT_陈寒7 小时前
React的setState竟然不是立刻生效的,害我调试半天
前端·人工智能·后端
简简单单就是我_hehe7 小时前
前端埋点日志解决方案:完整 User-Agent 解析工具实现,爬虫识别、设备品牌、操作系统、浏览器版本全解析(附完整源码)
前端·爬虫