玩转Vue3之shallowRef和shallowReactive

前言

Vue3 作为一款现代的 JavaScript 框架,引入了许多新的特性和改进,其中包括 shallowRef 和 shallowReactive。这两个功能在Vue 3中提供了更加灵活和高效的状态管理选项,尤其适用于大型和复杂的应用程序。

Vue 3 的响应式系统

Vue3 引入了新的响应式系统,与 Vue2相比,它具有更好的性能和更多的功能。这个新系统基于 Proxy,为开发者提供了更直观、灵活的API,其中包括ref、reactive、shallowRef和shallowReactive等。之前的文章写过有关响应式系统的解释,在本博客中,我们将深入探讨这两个API,并提供一些具体的例子,以便更好地理解它们的用法和优势。

1.shallowRef:浅层响应式引用

shallowRef 是一个创建响应式对象的函数,与 ref 不同之处在于,shallowRef 只会在对象的第一层进行响应式处理。这意味着当对象的深层属性发生变化时,不会触发视图更新,从而提高了性能。

让我们看一个例子:

js 复制代码
import { shallowRef, watchEffect } from 'vue';

const user = shallowRef({
  name: 'John',
  address: {
    city: 'New York',
    zip: '10001'
  }
});

watchEffect(() => {
  console.log('User changed:', user.value);
});

// 修改深层属性,不会触发视图更新
user.value.address.city = 'San Francisco';

在上面的例子中,watchEffect 只会在 name 属性发生变化时触发,而不会在 address 的变化时触发。这有助于避免不必要的性能开销,这对于一些场景非常有用,例如在处理大型数据集合时,可以提高性能并减少不必要的更新。

2.shallowReactive:浅层响应式对象

与 shallowRef 类似,shallowReactive 用于创建一个浅层响应式的对象。这意味着只有对象的第一层属性会被响应化,这对于避免在深层次对象中进行递归响应式转换非常有用。

js 复制代码
import { shallowReactive, watchEffect } from 'vue';

const user = shallowReactive({
  name: 'John',
  address: {
    city: 'New York',
    zip: '10001'
  }
});

watchEffect(() => {
  console.log('User changed:', user);
});

// 修改深层属性,不会触发视图更新
user.address.city = 'San Francisco';

在上述例子中,watchEffect 只在 name 属性变化时触发,而 address 属性的变化不会引起更新。

使用场景

1. 性能优化

在处理大型数据集或嵌套对象时,使用 shallowRef 和 shallowReactive 可以提高性能,避免不必要的响应式转换和更新。

2. 避免无限循环

当你在数据模型中存在相互引用的情况时,使用 shallowRef 和 shallowReactive 可以帮助你避免创建无限循环的响应式数据。

3. 更精确的控制

如果你只关心对象的第一层属性,而不希望触发深层次的更新,那么 shallowRef 和 shallowReactive 提供了更精确的控制。

结论

使用 shallowRef 和 shallowReactive 的性能优势在于避免了深层对象的递归侦听,从而减少了触发响应式系统的次数。这对于大型项目和数据结构来说是非常有用的。

通过了解它们的使用方式和性能优势,我们可以更好地利用 Vue3 的响应式系统。始终记住,在使用这些特性时,要根据具体情况权衡性能和开发的便利性,确保你的代码保持清晰、易读和可维护。

相关推荐
RuoyiOffice11 小时前
SpringBoot OA推荐:面向信创选型,看看这套企业协同平台
spring boot·vue3·信创·flowable·企业协同·ruoyi office·oa选型
周厉12 小时前
WebSocket 使用场景与实现方法:Java + Vue3 全栈实战
java·websocket·vue3·websocket双向通讯
红红谈说1 天前
同一套产品两个技术栈,双版本前端工程差异怎么收敛?
前端·uni-app·vue3·前后端分离·双版本维护·接口约定
RuoyiOffice2 天前
Flowable 状态通知设计:单体用本地事件,微服务如何回写业务状态?
spring boot·微服务·vue3·flowable·ruoyi office·redis stream·流程状态通知
AI开源软件2 天前
SpringBoot + Vue3 人力资源管理系统推荐:组织、档案与移动办公
vue3·springboot·ruoyi·oa系统·移动办公·人力资源管理系统·hrm
梅雅达编程笔记2 天前
Day 17 | uni-app 小程序:前端从零搭建
微信小程序·typescript·uni-app·vue3·pinia·前端开发·全栈
RuoyiOffice3 天前
项目预算和交付日期变了,为什么不能直接改台账?
spring boot·项目管理·vue3·flowable·业务建模·ruoyi office·项目变更
AI源码4 天前
图书馆借阅管理系统
vue3·springboot
RuoyiOffice4 天前
SpringBoot+Vue3 单据校验设计:保存草稿、提交审批、退回重填,各该检查什么?
spring boot·vue3·flowable·表单设计·ruoyi office·草稿保存·单据校验
RuoyiOffice6 天前
SpringBoot+Vue3 业财协同架构:预算、费用分摊、发票、往来与凭证怎样避免五套数字
spring boot·vue3·财务管理·spring boot 3·预算管理·ruoyi office·业财协同