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 的属性不会被自动解包了。
相关推荐
To_OC6 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
咩咩啃树皮7 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
阳光是sunny7 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
触底反弹7 小时前
一文搞懂 Tailwind CSS 弹性布局:从原理到实战
前端·css·html
阳光是sunny7 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
To_OC7 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
小林ixn8 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
REDcker8 小时前
显示分辨率标准对照详解
前端·网络·分辨率·显示·屏幕
এ慕ོ冬℘゜8 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
武子康9 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端