Vue3中的shallowRef 和shallowReactive

文章介绍了Vue中的shallowRef和shallowReactive指令,它们分别用于创建只对基本数据类型响应式和对象最外层属性响应式的引用。在示例中,shallowRef只处理数字age的更新,而不处理深层对象属性如user.a.b的变化,后者需要使用shallowReactive来实现其外层属性的响应式更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 shallowRef

只处理基本数据类型的响应式, 不进行对象的响应式处理。

<template>
  <h1>{{ user.age }}</h1>
  <button @click="user.age++">点击+</button>
</template>
  
<script setup lang="ts">
import { reactive, ref, shallowReactive, shallowRef } from 'vue';

let user = shallowRef({
  age: 0
});

</script>

shallowReactive 

只处理对象最外层属性的响应式(浅响应式) 

  

<template>
  <h1>user.a.b {{ user.a.b }}</h1>

  <button @click="user.a.b++">点击+</button>

</template>
  
<script setup lang="ts">
import { reactive, ref, shallowReactive, shallowRef } from 'vue';

let user = shallowReactive({
  age: 0,
  a: {
    b: 0
  }
});

</script>

 

 

### shallowReactive shallowRef 的区别、用法及适用场景 #### 1. shallowReactive 的定义与用法 `shallowReactive` 是 Vue 3 提供的一个响应式 API,用于创建一个浅层的响应式对象。这意味着只有对象的直接属性是响应式的,而嵌套的对象或数组不会被递归地转换为响应式[^5]。 - **使用方法**: ```javascript import { shallowReactive } from &#39;vue&#39;; const obj = shallowReactive({ message: &#39;Hello&#39;, nestedObject: { property: &#39;value&#39; } }); // 修改顶层属性会触发视图更新 obj.message = &#39;hello World!&#39;; // 修改嵌套属性不会触发视图更新 obj.nestedObject.property = &#39;New Value&#39;; ``` 上述代码中,修改 `message` 属性会触发视图更新,但修改 `nestedObject.property` 不会触发更新。 #### 2. shallowRef 的定义与用法 `shallowRef` 是 Vue 3 中另一个响应式 API,用于创建一个浅层的引用类型数据。它与 `ref` 的主要区别在于,`shallowRef` 不会对内部值进行深度响应式处理[^4]。 - **使用方法**: ```javascript import { shallowRef, watchEffect, triggerRef } from &#39;vue&#39;; const state = shallowRef({ greet: &#39;Hello, world&#39; }); watchEffect(() => { console.log(state.value.greet); }); // 修改内部属性不会触发响应式更新 state.value.greet = &#39;Hello, universe&#39;; // 使用 triggerRef 强制触发更新 triggerRef(state); ``` 在上述代码中,`state.value.greet` 的修改不会自动触发响应式更新,需要通过 `triggerRef` 手动触发。 #### 3. 区别对比 | 特性 | shallowReactive | shallowRef | |---------------------|-----------------------------------------------|--------------------------------------------| | **作用目标** | 对象或数组 | 基础类型或复杂对象 | | **响应式层级** | 浅层(仅顶层属性) | 浅层(不递归处理内部值) | | **是否需要手动触发**| 不需要 | 需要(通过 `triggerRef` 触发) | | **适用场景** | 数据结构较简单,嵌套较少的情况 | 处理复杂对象,避免深度响应式开销较大的场景 | #### 4. 适用场景 - **shallowReactive**:适用于对象结构较简单且不需要对深层嵌套属性进行响应式处理的场景。例如,当组件中的数据对象只包含一些基本的键值对时,可以使用 `shallowReactive` 来减少不必要的性能开销[^5]。 - **shallowRef**:适用于需要处理复杂对象但又不希望对其内部值进行深度响应式处理的场景。例如,在某些情况下,外部传入的数据可能是一个大对象,我们只需要监听整个对象的变化而不是其内部属性的变化。 #### 示例代码 ```javascript // shallowReactive 示例 import { shallowReactive } from &#39;vue&#39;; const state = shallowReactive({ name: &#39;Vue 3&#39;, config: { theme: &#39;light&#39;, version: 3 } }); state.name = &#39;Vue 3 Updated&#39;; // 触发更新 state.config.theme = &#39;dark&#39;; // 不触发更新 // shallowRef 示例 import { shallowRef, watchEffect, triggerRef } from &#39;vue&#39;; const user = shallowRef({ name: &#39;John&#39;, age: 30 }); watchEffect(() => { console.log(user.value.name); }); user.value.age = 31; // 不触发更新 user.value.name = &#39;Doe&#39;; // 不触发更新 triggerRef(user); // 手动触发更新 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值