vue3 shallowRef和shallowReactive

本文探讨Vue的shallowRef特性,它用于创建一个响应式的引用,当对象整体被替换时才会触发更新,而不是跟踪内部属性变化。了解何时使用shallowRef,以及它如何影响性能和数据绑定。

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

 shallowRef使用定义一个不会其对象内的值改变的数据时,或者每次改变都是替换掉整个对象而不是去单单替换掉其中的某个属性

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值