揭开 Vue 3 中大量使用 ref 的隐藏危机

在 Vue 3 中,ref 是用来创建响应式的引用,它能够追踪和管理单一的变量或对象。当代码中大量使用 ref 时,虽然可以实现对各个状态或数据的精细控制,但也会带来一些问题和潜在影响。

1. 大量使用 ref 带来的问题

1、代码冗长与维护成本高

当一个组件中大量使用 ref,每个状态都需要单独的声明和赋值,会导致代码变得冗长、不易阅读。而且会频繁看到 ref(变量)和 变量.value 的形式,这使得代码的可读性降低,维护变得更加困难。

2、响应式系统性能负担

每个 ref 创建的响应式对象都要被 Vue 的响应式系统追踪和更新。当存在大量的 ref ,Vue 的响应式系统需要处理更多的状态变化,可能会对性能产生负面影响,特别是在大型应用或复杂组件中。

3、频繁 .value 操作

ref 包装的值需要通过 .value 来访问或更新,这在某些情况下容易引发不必要的重复代码,降低代码的简洁性。此外,使用时还需特别注意,什么时候该使用 .value,什么时候不使用。

4、数据管理混乱

当一个组件中有太多 ref,会导致管理状态变得复杂,难以明确哪个 ref 控制哪个部分的数据或逻辑,增加了组件的复杂度。

2. 改进方法

2.1 使用 reactive 替代 ref

如果需要管理多个相关的状态,建议使用 reactive 而不是多个 ref。reactive 可以将整个对象变成响应式的,这样就可以操作对象的属性来管理多个状态,而不需要单独创建多个 ref。

举个 🌰

1、使用 ref

<template><div class="container"><p>name:{{ name }}</p><p>age:{{ age }}</p><p>address:{{ address }}</p></div>
</template><script>
import { ref } from 'vue';
export default {setup() {const name = ref('');const age = ref(0);const address = ref('');const createUser = () => {name.value = 'John';age.value = 20;address.value = 'New York';};createUser();return {name,age,address,};},
};
</script>

2、优化后使用 reactive 

<template><div class="container"><p>name:{{ user.name }}</p><p>age:{{ user.age }}</p><p>address:{{ user.address }}</p></div>
</template><script>
import { reactive } from 'vue';
export default {setup() {const user = reactive({name: '',age: 0,address: '',});const createUser = () => {user.name = 'John';user.age = 20;user.address = 'New York';};createUser();return {user,};},
};
</script>

展示都是一样的:

在这个例子中,使用 reactive 将 name、age 和 address 放在同一个对象中管理,减少了多个 ref,使代码更加简洁,且更容易维护。

2.2 使用 computed 来处理派生状态

如果某个状态是从其他状态推导出来的,那么可以使用 computed 来代替 ref,从而避免创建额外的响应式数据。

举个 🌰

import { ref, computed } from 'vue';export default {setup() {const firstName = ref('John');const lastName = ref('Doe');// 使用 computed 来合成新的状态,而不是通过 ref 手动管理const fullName = computed(() => `${firstName.value} ${lastName.value}`);return {firstName,lastName,fullName,};},
};
2.3 使用组合式函数 (Composables)

当状态逻辑非常复杂时,考虑将逻辑拆分成多个组合式函数(Composables)。这不仅有助于代码组织,还能在不同组件间共享相似的逻辑,而不是在每个组件中重复定义多个 ref。

举个 🌰

<template><div class="container"><p>name:{{ user.name }}</p><p>age:{{ user.age }}</p><p>address:{{ user.address }}</p></div>
</template><script>
import { ref, reactive } from 'vue';
// 组合式函数:管理用户信息
function useUser() {const user = reactive({name: '',age: 0,address: '',});const updateUser = (newUser) => {user.name = newUser.name;user.age = newUser.age;user.address = newUser.address;};return {user,updateUser,};
}
export default {setup() {const { user, updateUser } = useUser();updateUser({name: 'Monica',age: 18,address: 'China',});return {user,};},
};
</script>

展示为:

这样可以将复杂的逻辑拆分到组合式函数中,在不同组件间复用状态和方法,减少了组件内部的状态管理复杂度。

3. 注意事项

1、ref vs reactive 区别

虽然 ref 和 reactive 都可以实现响应式状态管理,但 ref 适合处理单一原始值(如数字、字符串等),而 reactive 适合处理对象。为了避免不必要的复杂性,当有多个相关状态时优先使用 reactive。

2、.value` 的使用

ref 的 .value 访问方式在 Vue 3 是强制的(除非使用解构 toRefs 等)。频繁使用 .value 会显得繁琐,所以如果要管理多个属性,最好使用 reactive 来避免这些问题。

3、watch 和 ref 

当使用 watch 监听 ref 时,注意 .value 的引用变化。Vue 的 watch 默认是深度监听(deep),在处理复杂对象时可以通过配置 deep: false 来避免不必要的性能开销。

总结:

使用大量 ref 可能导致代码冗长、性能问题和维护难度的增加。为了解决这些问题,可以采用 reactive 管理多个状态,使用 computed 来处理派生状态,或者使用组合式函数来拆分逻辑。通过优化 ref 的使用,可以提升代码的可读性、性能和易维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/145598.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

第10章 面向对象编程(高级部分)

第10章 面向对象编程(高级部分) 文章目录 第10章 面向对象编程(高级部分)10.1 类变量和类方法10.1.1 类变量-提出问题10.1.2 传统的方法来解决10.1.3 类变量快速入门10.1.4 类变量内存布局10.1.5 什么是类变量10.1.6 如何定义类变量10.1.8 类变量使用注意事项和细节讨论10.1.9 …

JavaScript - Document文档操作

1. 前言 ​​​​​​​ 编写网页时&#xff0c;我们需要时刻操作文档进而完成我们想要的效果。这就是通过文档对象模型实现&#xff0c;使用Document对象控制HTML以及样式信息的API 2. Document的树结构 在了解Document文档对象模型之前&#xff0c;我们先了解Dom的树结构 …

pg入门1——使用容器启动一个pg

1. 下载pg镜像 地址&#xff1a; https://hub.docker.com/r/bitnami/postgresql 下载镜像&#xff1a; docker pull bitnami/postgresql:16.3-alpine3.20 2. 运行镜像 docker run -e POSTGRES_PASSWORDAb123456! -d bitnami/postgresql:16.3-alpine3.20 3. 查看、进入容…

如何使用VMware安装Linux操作系统

使用VMware安装Linux操作系统。以Cont OS为例进行说明。 准备工作&#xff1a; 下载并安装VMware&#xff1a; 下载地址&#xff1a;https://support.broadcom.com/ 下载好VMware&#xff0c;就是吧下载好的VMware安装&#xff0c;只需要“下一步”就行&#xff0c;只是到路径…

惠海H6118 DC-DC 降压恒流芯片30V36v40V48V降12V9V24V36V 1.2A大电流 调光降压芯片IC舞台灯

H6118是一款连续电感电流导通模式的降压型LED恒流驱动器&#xff0c;用于驱动一个或多个LED灯串。H6118工作电压从4V到30V&#xff0c;提供可调的输出电流&#xff0c;最大输出电流可达到1.2A。 H6118内置功率开关管&#xff0c;采用高端电流检测电路&#xff0c;支持PWM模式调…

即时通讯框架MobileIMSDK的H5端开发快速入门

► 相关链接&#xff1a; ① MobileIMSDK-H5端的详细介绍② MobileIMSDK-H5端的开发手册new&#xff08;* 精编PDF版&#xff09; 一、技术准备 您是否已对Web端即时通讯技术有所了解&#xff1f; 1&#xff09;新手入门贴&#xff1a;史上最全Web端即时通讯技术原理详解2&…

提前解锁 Vue 3.5 的新特性

Vue 3.5 是 Vue.js 新发布的版本&#xff0c;虽然没有引入重大变更&#xff0c;但带来了许多实用的增强功能、内部优化和性能改进。 1. 响应式系统优化 Vue 3.5 进一步优化了响应式系统的性能&#xff0c;并且减少内存占用。尤其在处理大型或深度嵌套的响应式数组时&#xff…

【论文阅读】Grounding Language with Visual Affordances over Unstructured Data

Abstract 最近的研究表明&#xff0c;大型语言模型&#xff08;llms&#xff09;可以应用于将自然语言应用于各种各样的机器人技能。然而&#xff0c;在实践中&#xff0c;学习多任务、语言条件机器人技能通常需要大规模的数据收集和频繁的人为干预来重置环境或帮助纠正当前的…

unix中如何查询和修改进程的资源限制

一、前言 一个进程在运行时&#xff0c;会用到各种资源&#xff0c;比如cpu的使用时间、内存空间、文件等等。那么&#xff0c;一个进程能够占用多少资源呢&#xff1f;cpu使用的时间有多长&#xff1f;进程空间有多大&#xff1f;能够创建多少个文件&#xff1f;这个就是本文…

【数据结构】设有一带头结点的单链表,编程将链表颠倒过来。要求不用另外的数 组或结点完成。

编程题: 设有一带头结点的单链表,编程将链表颠倒过来。要求不用另外的数 组或结点完成。 分析: 该算法通过维护三个指针(prev、curr 和 next)逐步遍历单链表,实现链表的逆转。在遍历过程中,curr 的 next 指针被更新为指向 prev,逐步反转指向。最终,头结点的 next 指针…

用户态缓存:高效数据交互与性能优化

目录 1. 用户态缓存区工作背景 1.1 为什么每条连接都需要读写缓存区 1.1.1 读缓存区&#xff08;Read Buffer&#xff09; 1.1.2 写缓存区&#xff08;Write Buffer&#xff09; 1.2 用户态缓存区的工作流程 1.3 用户态缓存区的重要性 2. UDP 和 TCP 的设计差异 2.1 UD…

Python模块和包:标准库模块(os, sys, datetime, math等)②

文章目录 一、os 模块1.1 获取当前工作目录1.2 列出目录内容1.3 创建和删除目录1.4 文件和目录操作 二、sys 模块2.1 获取命令行参数2.2 退出程序2.3 获取 Python 版本信息 三、datetime 模块3.1 获取当前日期和时间3.2 日期和时间的格式化3.3 日期和时间的运算 四、math 模块4…

私有化聊天软件成为企业内部通讯新趋势

在数字化转型浪潮的推动下&#xff0c;企业对于高效、安全、灵活的内部通讯需求日益增长。传统的电子邮件、电话会议等沟通方式已难以满足现代企业对即时性、协作性和信息安全性的要求。因此&#xff0c;私有化聊天工具作为企业内部通讯的定制化解决方案&#xff0c;正逐渐成为…

我的数据库第一课:从懵懂到启迪

我的数据库第一课&#xff1a;从懵懂到启迪 前言 在数字化浪潮席卷全球的今天&#xff0c;数据库作为IT技术的“活化石”&#xff0c;已经成为不可或缺的基础设施。特别是在国内&#xff0c;随着经济的飞速发展和信息化建设的推进&#xff0c;数据库技术也经历了从无到有、从…

企业微信用户授权与校验完整对接流程

Hello&#xff01;欢迎各位新老朋友来看小弟博客&#xff0c;祝大家事业顺利&#xff0c;财源广进&#xff01;&#xff01; 主题&#xff1a;企业微信用户授权与校验完整对接流程 一&#xff1a;构造第三方应用授权链接 如果第三方应用需要在打开的网页里面携带用户的身份信息…

解锁数字转型新纪元:Vatee万腾平台,您的智能加速与策略智库

在数字经济时代的大潮中&#xff0c;企业的数字化转型已不再是选择题&#xff0c;而是必答题。面对这一挑战&#xff0c;Vatee万腾平台以其卓越的技术实力和前瞻性的战略视野&#xff0c;成为了众多企业加速数字化转型、实现智能化升级的得力助手和智囊团。 加速转型&#xff…

个人量化成功之路-----用代码一键画图Donchian Channel(唐奇安通道指标)

Donchian Channel&#xff08;唐奇安通道指标&#xff09;是用于交易突破的最古老、最简单的技术指标之一。是由Richard Donchian 提出的一个由三条线&#xff08;上阻力线、下支撑线、中心线&#xff09;组成的通道指标。 一般来说&#xff0c;唐奇安通道的宽度越宽&#xff0…

ISSCC34.7解析一种具备内存编码与刷新功能的eDRAM查找表数字存内计算芯片

一、引言 1. DCIM概述 数字存内计算&#xff08;Digital Computing-in-Memory, DCIM&#xff09;是一种将计算操作直接集成到存储单元中的新兴计算架构。传统计算模型&#xff08;冯诺依曼架构&#xff09;中的计算和存储是分离的&#xff0c;数据必须频繁在存储器和处理单元…

FastDFS的docker部署及实现头像上传

FastDFS的使用并实现头像上传 一、FastDFS概述二、安装FastDFS1. 拉取镜像2. 安装tracker3. 安装storage4. NGINX服务启动三、配置和依赖配置依赖四、头像上传一、FastDFS概述 概述 上传交互过程 两个服务:Tracker Server 和Storage Server Tracker Server 跟踪服务,负责调…

UNRAID系统忘记密码解决办法

前言 unraid系统自己通过命令修改密码以后&#xff0c;怎么也进不去了。 这次带来如何重置密码 操作