vue3 - shallowReactive浅层响应式对象(只对顶层属性)

文章目录

    • [1. `shallowReactive` 的作用](#1. shallowReactive 的作用)
    • [2. 基本用法](#2. 基本用法)
      • [**`shallowReactive` 与 `reactive` 的区别**](#shallowReactivereactive 的区别)
    • [3. 使用场景](#3. 使用场景)
    • [4. 总结](#4. 总结)

Vue 3 中, shallowReactive 是响应式系统提供的一个函数,它与 reactive 类似,但有一个关键区别:它只对对象的 顶层属性 进行响应式处理,而不会递归地对嵌套对象或数组进行响应式代理。这与 shallowRef 的思想类似,但作用在 对象本身 而不是引用上。

1. shallowReactive 的作用

  • 创建一个 浅层响应式对象
  • 顶层属性(第一层属性)会被 Vue 的响应式系统代理。
  • 嵌套的对象或数组不会被代理为响应式。
  • 适合那些只需要顶层响应式、或者嵌套对象不需要深度追踪的场景。

2. 基本用法

js 复制代码
<template>
  <div>
    <h1>{{ state.count }}</h1>
    <h1>{{ state.nested.name }}</h1>
    <button @click="updateCount">修改顶层属性</button> <br />
    <button @click="updateShallowReactive">强行修改嵌套属性</button>
  </div>
</template>
<script setup lang="ts">
import { shallowReactive } from "vue";

const state = shallowReactive({
  count: 0,
  nested: { name: "Vue", version: 3 }
});

console.log(state.count); // 0
console.log(state.nested.name); // 'Vue'

// 定义一个方法来修改顶层属性
function updateCount() {
  state.count++; // 修改顶层属性,会触发视图更新
  console.log("修改顶层属性:", state.count); // 输出 累加
}
// 定义一个方法来强行修改 shallowReactive
function updateShallowReactive() {
  // 修改嵌套对象的属性,不会触发视图更新
  state.nested.name = "React";
  console.log("强行修改嵌套属性后:", state.nested.name); // 输出 React
}
</script>
  • state.count 是顶层属性,修改它会触发响应式更新。
  • state.nested 是嵌套对象,其内部属性 name 不会被代理,因此修改它不会触发更新。

如图所示:

shallowReactivereactive 的区别

特性 reactive shallowReactive
响应式深度 深度响应式(递归代理嵌套对象) 浅层响应式(只代理顶层属性)
性能开销 较大 较小
适用场景 需要深度追踪对象变化 只关心顶层属性变化,或优化性能

3. 使用场景

  1. 性能优化

    • 当对象嵌套层级较深或对象很大时,使用 shallowReactive 可以减少 Vue 对嵌套对象递归代理的开销。
  2. 只关心顶层属性

    • 如果你只关心对象顶层的变化,而不需要追踪嵌套对象的变化,可以使用 shallowReactive

4. 总结

  • shallowReactive 创建一个 浅层响应式对象,只代理顶层属性。
  • 它适合 性能优化、只关心顶层属性变化或嵌套对象不需要响应式的场景。
  • reactive 相比,它减少了不必要的代理和性能开销,但使用时要注意嵌套对象的变化不会被追踪。

👉点击进入 我的网站

相关推荐
FREEDOM_X5 分钟前
Linux 进程间通讯(IPC)——总结
linux·c语言·前端·嵌入式硬件·struts
WWBQU28 分钟前
前端day06
前端
岁月宁静34 分钟前
DeepSeek Harness 团队 招聘 :JD反推:新手如何系统掌握AI Agent开发技术?
前端·人工智能·后端
小则又沐风a41 分钟前
深入理解文件系统(二)
java·服务器·前端
sztomarch1 小时前
Disable-Download-Chrome-AI-Mode
前端·chrome
禅思院1 小时前
AI对话前端从入门到崩溃:一个长对话引发的五层优化战争【三】
前端·架构·前端框架
DianSan_ERP10 小时前
电商架构演进:如何在高并发场景下实现多平台API的标准化履约?
运维·前端·网络·安全·架构·自动化
碎_浪13 小时前
给键盘党的英语记忆工具:我做了一款「打字背单词」桌面应用
前端·程序员·ai编程
阿成学长_Cain13 小时前
Linux dirs命令详解|Bash目录堆栈管理快速切换目录实战教程
linux·运维·前端·数据库
多加点辣也没关系14 小时前
JavaScript|第4章:类型转换
开发语言·javascript