用了组合式 (Composition) API 后代码变得更乱了,怎么办?

news2024/9/25 17:22:02

前言

组合式 (Composition) API 的一大特点是“非常灵活”,但也因为非常灵活,每个开发都有自己的想法。加上项目的持续迭代导致我们的代码变得愈发混乱,最终到达无法维护的地步。本文是我这几年使用组合式API的一些经验总结,希望通过本文让你也能够写出易维护优雅组合式API代码。

加入欧阳的高质量vue源码交流群、欧阳平时写文章参考的多本vue源码电子书

选项式API

vue2的选项式API因为每个选项都有固定的书写位置(比如数据就放在data里面,方法就放在methods里面),所以我们只需要将代码放到对应的选项中就行了。

优点是因为已经固定了每个代码的书写位置,所有人写出来的代码风格都差不多。

缺点是当单个组件的逻辑复杂到一定程度时,代码就会显得特别笨重,非常不灵活。
option-api

随意的写组合式API

vue3推出了组合式 (Composition) API,他的主要特点就是非常灵活。解决了选项式API不够灵活的问题。但是灵活也是一把双刃剑,因为每个开发的编码水平不同。所以就出现了有的人使用组合式 (Composition) API写出来的代码非常漂亮和易维护,有的人写的代码确实很混乱和难易维护。

比如一个组件开始的时候还是规规矩矩的写,所有的ref响应式变量放在一块,所有的方法放在一块,所有的computed计算属性放在一块。

但是随着项目的不断迭代 ,或者干脆是换了一个人来维护。这时的代码可能就不是最开始那样清晰了,比如新加的代码不管是refcomputed还是方法都放到一起去了。如下图:
chao

只有count1count2时,代码看着还挺整齐的。但是随着count3的代码加入后看着就比较凌乱了,后续如果再加count4的代码就会更加乱了。

有序的写组合式API

为了解决上面的问题,所以我们约定了一个代码规范。同一种API的代码全部写在一个地方,比如所有的props放在一块、所有的emits放在一块、所有的computed放在一块。并且这些模块的代码都按照约定的顺序去写,如下图:
sort

随着vue组件的代码增加,上面的方案又有新的问题了。

还是前面的那个例子比如有5个countref变量,对应的computedmethods也有5个。此时我们的vue组件代码量就很多了,比如此时我想看看computed1increment1的逻辑是怎么样的。

因为computed1increment1函数分别在文件的computedmethods的代码块处,computed1increment1之间隔了几十行代码,看完computed1的代码再跳转去看increment1的代码就很痛苦。如下图:
long

这时有小伙伴会说,抽成hooks呗。这里有5个count,那么就抽5个hooks文件。像这样的代码。如下图:
hooks-file

一般来说抽取出来的hooks都是用来多个组件进行逻辑共享,但是我们这里抽取出来的useCount文件明显只有这个vue组件会用他。达不到逻辑共享的目的,所以单独将这些逻辑抽取成名为useCounthooks文件又有点不合适。

最终解决方案

我们不如将前面的方案进行融合一下,抽取出多个useCount函数放在当前vue组件内,而不是抽成单个hooks文件。并且在多个useCount函数中我们还是按照前面约定的规范,按照顺序去写ref变量、computed、函数的代码。

最终得出的最佳实践如下图:
perfect

上面这种写法有几个优势:

  • 我们将每个count的逻辑都抽取成单独的useCount函数,并且这些函数都在当前vue文件中,没有将其抽取成hooks文件。如果哪天useCount1中的逻辑需要给其他组件使用,我们只需要新建一个useCount文件,然后直接将useCount1函数的代码移到新建的文件中就可以了。

  • 如果我们想查看doubleCount1increment1中的逻辑,只需要找到useCount1函数,关于count1相关的逻辑都在这个函数里面,无需像之前那样翻山越岭跨越几十行代码才能从doubleCount1的代码跳转到increment1的代码。

总结

本文介绍了使用Composition API的最佳实践,规则如下:

  • 首先约定了一个代码规范,Composition API按照约定的顺序进行书写(书写顺序可以按照公司代码规范适当调整)。并且同一种组合式API的代码全部写在一个地方,比如所有的props放在一块、所有的emits放在一块、所有的computed放在一块。

  • 如果逻辑能够多个组件复用就抽取成单独的hooks文件。

  • 如果逻辑不能给多个组件复用,就将逻辑抽取成useXXX函数,将useXXX函数的代码还是放到当前组件中。

    第一个好处是如果某天useXXX函数中的逻辑需要给其他组件复用,我们只需要将useXXX函数的代码移到新建的hooks文件中即可。

    第二个好处是我们想查看某个业务逻辑的代码,只需要在对应的useXXX函数中去找即可。无需在整个vue文件中翻山越岭从computed模块的代码跳转到function函数的代码。

最后推荐一下欧阳自己写的开源电子书vue3编译原理揭秘,这本书初中级前端能看懂。完全免费,只求一个star。

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

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

相关文章

【从相邻元素对还原数组】python刷题记录

R3-图篇 饭前一道题 思路: 单向构造 class Solution:def restoreArray(self, adjacentPairs: List[List[int]]) -> List[int]:mnlen(adjacentPairs)#n表示数组元素总数n1#统计dictdefaultdict(int)#存储关系哈希表hashmapdefaultdict(list)for a,b in adjacent…

DeDeCMS漏洞

一.登陆后台 二.文件管理上传shell 我们写一个一句话木马 然后上传 访问他 然后复制网址用工具连接 连接成功 修改模板文件拿shell 找到index.html修改 保存 然后进行下面的操作 访问返回的地址 然后用工具连接 三、后台任意命令执行拿shell 然后写入一个木马 添加成功 点击代…

开源:LLMCompiler高性能工具调用框架

开源:LLMCompiler高性能工具调用框架 LLMCompilerLLMCompiler 框架图任务提取单元使用方式参考链接 LLMCompiler LLMCompiler 是一种 Agent 架构,旨在通过在DAG中快速执行任务来加快 Agent 任务的执行速度。它还通过减少对 LLM 的调用次数来节省 Tokens …

51 华三路由

PC4 路由 能通的区域 MSR2

Vue和React谁更牛逼?看了你就有答案

你好同学,我是沐爸,欢迎点赞、收藏和关注!个人知乎、公众号"沐爸空间" 使用 Chrome 浏览器,安装 Vue.js Devtools 和 React Developer Tools 浏览器插件后,打开网站即可知晓当前网站是使用的 Vue 框架还是 …

JCの技巧

当你们私下有矛盾,(或者你被J惨了),可以试试以下方法 1.拔电线 优点:快准狠 缺点:看看你身后 2.定时关机 优点:猝不及防 缺点:设置时容易翻车 3.改代码 优点:长代码看不出来…

【数据结构入门 】队列

目录 前言 一、队列的概念及结构 1.概念 2.结构 二、队列的实现 1.队列的声明 2.初始化队列 3.队列的销毁 4.入队 5.出队 6.获取队列有效元素个数 7. 判断队列是否为空 8.获取队首元素 9.获取队尾元素 结论 前言 队列是一种数据结构,它遵循先进先出&#…

数字与位操作——168、670、233、357、400

168. Excel表列名称(简单) 给你一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。 例如: A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...示例 1: 输入:columnNumb…

[NISACTF 2022]ezstack-入土为安的第十四天

签到题吧 checksec pwn 没有保护 进入main函数,点进shell ,buf 88808048buf system 08048512 /bin/sh 0804A024 直接让代码溢出调用system和/bin/sh from pwn import *# 连接到远程服务 p remote(node5.anna.nssctf.cn, 20789)# 构造 payload payl…

第三期书生大模型实战营之Llamaindex RAG实践

基础任务 任务要求:基于 LlamaIndex 构建自己的 RAG 知识库,寻找一个问题 A 在使用 LlamaIndex 之前InternLM2-Chat-1.8B模型不会回答,借助 LlamaIndex 后 InternLM2-Chat-1.8B 模型具备回答 A 的能力,截图保存。 streamlit界面…

OS_进程

2024.06.25:操作系统进程学习笔记 第6节 进程 6.1 进程的定义6.2 进程的基本特征(动态、并发、独立、异步)6.3 机器状态(进程可以读取/更新的内容)6.3.1 虚拟化技术6.3.2 进程的地址空间(虚拟存储器技术要学…

基于OpenCV-Python的彩色图像傅里叶变换

如果用OpenCV-Python进行图像的离散傅里叶变换与逆变换其实还蛮简单的,流程就是上图所示,值得注意的是,如果是多通道的图像,譬如多光谱、高光谱图像,需要对每个通道都进行傅里叶变换,最后再聚合&#xff0c…

数字乡村 | 是什么、建什么、怎么建?附200份详尽解决方案下载

数字乡村是什么 如何将数字乡村建设与全面实施乡村振兴战略有效衔接,已成为当前农业农村工作的重要课题。 200份资料下载方式,请看每张图片右下角信息 数字乡村作为一种新的乡村社会发展形态,是当今第四次工业革命工业互联网 生态系统的持…

如何在Java中调用数学中的log函数

在Java中,调用数学中的对数(log)函数通常是通过Math类来实现的。Math类提供了多种对数函数的实现,但最常用的是自然对数(底数为e的对数)和以10为底的对数。 自然对数(底数为e) 使用…

深度学习之参数初始化问题

参数初始化 1、 参数初始化可以减缓梯度爆炸和梯度消失问题 2、tanh一般使用Xavier初始化方法 3、Relu及其变种使用Kaiming初始化方法 V a r ( X ) E ( X 2 ) − E ( X ) 2 V a r ( X Y ) V a r ( X ) V a r ( Y ) , 当 X 和 Y 互相独立 V a r ( X Y ) V a r ( X ) V a r…

【机器学习基础】Scikit-learn主要用法

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科,通过算法和模型让计算机从数据中学习,进行模型训练和优化,做出预测、分类和决策支持。Python成为机器学习的首选语言,…

C语言 ——— 学习、使用 strstr函数 并模拟实现

目录 strstr函数的功能 学习strstr函数​编辑 使用strstr函数 模拟实现strstr函数 strstr函数的功能 在字符串 str1 中找 str2 字符串,如果在 str1 字符串中找到了 str2 字符串,就返回 str1 中找到的 dtr2 的地址,没找到的话就返回 NU…

[CR]厚云填补_MSDA-CR

Cloud Removal in Optical Remote Sensing Imagery Using Multiscale Distortion-Aware Networks Abstract 云层污染是光学遥感图像中常见的问题。基于深度学习的遥感图像去云技术近年来受到越来越多的关注。然而,由于缺乏对云失真效果的有效建模和网络较弱的特征表…

EasyMR如何为服务开启Kerberos

作者:雅泽 一、Hadoop为什么需要安全 最早部署Hadoop集群时并没有考虑安全问题,未开启安全认证时,Hadoop 是以客户端提供的用户名作为用户凭证, 一般即是发起任务的Unix 用户。一般线上机器部署服务会采用统一账号,当…

CPU与Load

1、CPU和LOAD分别是什么load就是负载吗,跟CPU啥关系,啥区别 CPU和Load(负载)是衡量计算机系统性能的两个重要指标,但它们关注的侧重点和意义不同。理解这两个指标及它们之间的关系对于系统优化和性能监控非常重要。 CP…