用了组合式 (Composition) API 后代码变得更乱了,怎么办?
前言
组合式 (Composition) API 的一大特点是“非常灵活”,但也因为非常灵活,每个开发都有自己的想法。加上项目的持续迭代导致我们的代码变得愈发混乱,最终到达无法维护的地步。本文是我这几年使用组合式API的一些经验总结,希望通过本文让你也能够写出易维护、优雅的组合式API代码。
欧阳写了一本开源电子书vue3编译原理揭秘,这本书初中级前端能看懂。完全免费,只求一个star。
选项式API
vue2的选项式API因为每个选项都有固定的书写位置(比如数据就放在data里面,方法就放在methods里面),所以我们只需要将代码放到对应的选项中就行了。
优点是因为已经固定了每个代码的书写位置,所有人写出来的代码风格都差不多。
缺点是当单个组件的逻辑复杂到一定程度时,代码就会显得特别笨重,非常不灵活。

随意的写组合式API
vue3推出了组合式 (Composition) API,他的主要特点就是非常灵活。解决了选项式API不够灵活的问题。但是灵活也是一把双刃剑,因为每个开发的编码水平不同。所以就出现了有的人使用组合式 (Composition) API写出来的代码非常漂亮和易维护,有的人写的代码确实很混乱和难易维护。
比如一个组件开始的时候还是规规矩矩的写,所有的ref响应式变量放在一块,所有的方法放在一块,所有的computed计算属性放在一块。
但是随着项目的不断迭代 ,或者干脆是换了一个人来维护。这时的代码可能就不是最开始那样清晰了,比如新加的代码不管是ref、computed还是方法都放到一起去了。如下图:

只有count1和count2时,代码看着还挺整齐的。但是随着count3的代码加入后看着就比较凌乱了,后续如果再加count4的代码就会更加乱了。
有序的写组合式API
为了解决上面的问题,所以我们约定了一个代码规范。同一种API的代码全部写在一个地方,比如所有的props放在一块、所有的emits放在一块、所有的computed放在一块。并且这些模块的代码都按照约定的顺序去写,如下图:

随着vue组件的代码增加,上面的方案又有新的问题了。
还是前面的那个例子比如有5个count的ref变量,对应的computed和methods也有5个。此时我们的vue组件代码量就很多了,比如此时我想看看computed1和increment1的逻辑是怎么样的。
因为computed1和increment1函数分别在文件的computed和methods的代码块处,computed1和increment1之间隔了几十行代码,看完computed1的代码再跳转去看increment1的代码就很痛苦。如下图:

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

一般来说抽取出来的hooks都是用来多个组件进行逻辑共享,但是我们这里抽取出来的userCount文件明显只有这个vue组件会用他。达不到逻辑共享的目的,所以单独将这些逻辑抽取成名为userCount的hooks文件又有点不合适。
最终解决方案
我们不如将前面的方案进行融合一下,抽取出多个useCount函数放在当前vue组件内,而不是抽成单个hooks文件。并且在多个useCount函数中我们还是按照前面约定的规范,按照顺序去写ref变量、computed、函数的代码。
最终得出的最佳实践如下图:

上面这种写法有几个优势:
我们将每个
count的逻辑都抽取成单独的useCount函数,并且这些函数都在当前vue文件中,没有将其抽取成hooks文件。如果哪天useCount1中的逻辑需要给其他组件使用,我们只需要新建一个useCount文件,然后直接将useCount1函数的代码移到新建的文件中就可以了。如果我们想查看
doubleCount1和increment1中的逻辑,只需要找到useCount1函数,关于count1相关的逻辑都在这个函数里面,无需像之前那样翻山越岭跨越几十行代码才能从doubleCount1的代码跳转到increment1的代码。
总结
本文介绍了使用Composition API的最佳实践,规则如下:
首先约定了一个代码规范,
Composition API按照约定的顺序进行书写(书写顺序可以按照公司代码规范适当调整)。并且同一种组合式API的代码全部写在一个地方,比如所有的props放在一块、所有的emits放在一块、所有的computed放在一块。如果逻辑能够多个组件复用就抽取成单独的
hooks文件。如果逻辑不能给多个组件复用,就将逻辑抽取成
useXXX函数,将useXXX函数的代码还是放到当前组件中。第一个好处是如果某天
useXXX函数中的逻辑需要给其他组件复用,我们只需要将useXXX函数的代码移到新建的hooks文件中即可。第二个好处是我们想查看某个业务逻辑的代码,只需要在对应的
useXXX函数中去找即可。无需在整个vue文件中翻山越岭从computed模块的代码跳转到function函数的代码。
关注公众号:【前端欧阳】,给自己一个进阶vue的机会

另外欧阳写了一本开源电子书vue3编译原理揭秘,这本书初中级前端能看懂。完全免费,只求一个star。
用了组合式 (Composition) API 后代码变得更乱了,怎么办?的更多相关文章
- 用AOP来让你的JS代码变得更有可维护性吧
此文已由作者吴佳祥授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 好吧我承认这是篇任务. 最近看到个消息,ES2017已经定稿了,心想,我去,还完全没了解ES2016呢,ES ...
- Console命令详解,让调试js代码变得更简单
Firebug是网页开发的利器,能够极大地提升工作效率. 但是,它不太容易上手.我曾经翻译过一篇<Firebug入门指南>,介绍了一些基本用法.今天,继续介绍它的高级用法. ======= ...
- [转] Console命令详解,让调试js代码变得更简单
http://www.cnblogs.com/see7di/archive/2011/11/21/2257442.html Firebug是网页开发的利器,能够极大地提升工作效率. 但是,它不太容易上 ...
- Firebug控制台详解,让调试js代码变得更简单
http://www.open-open.com/lib/view/open1373120100347.html Firebug是网页开发的利器,能够极大地提升工作效率. Firebug控制台详解 控 ...
- Windows Composition API 指南 - 认识 Composition API
微软在 Windows 10中 面向通用 Windows 应用 (Universal Windows Apps, UWA) 新引入了一套用于用户界面合成的 API:Composition API.Co ...
- Vue 3.0 Composition API - 中文翻译
Composition API 发布转载请附原文链接 https://www.cnblogs.com/zgh-blog/articles/composition_api.html 这两天初步了解了下 ...
- UWP Composition API - 锁定列的FlexGrid
需求是第一列锁定,那么怎么让锁定列不跟着滚动条向做移动呢? 其实很简单,让锁定列跟scrollviewer的滚动做反方向移动. 先看一下这个控件的模板,嗯,其实很简单,就是ListView的模板,不同 ...
- UWP Composition API - RadialMenu
用Windows 8.1的童鞋应该知道OneNote里面有一个RadialMenu.如下图,下图是WIn10应用Drawboard PDF的RadialMenu,Win8.1的机器不好找了.哈哈,由于 ...
- Vue 3.0 中令人激动的新功能:Composition API
正如你所期望的那样,Vue 3带来了很多令人兴奋的新功能.值得庆幸的是,Vue团队主要是在当前API的基础上引入了一些补充和改进,而不是进行重大更改,所以已经了解Vue 2的人应该很快就会对新的语法感 ...
- 让iOS开发变得更有效率-分类、工具类
在工作中整理的一些分类与工具类,分享给大家.这些工具类可以减少项目中的代码量,让代码变得更简洁,可以大大的提升项目的效率,直接拖到项目中使用即可.下载地址:https://github.com/lee ...
随机推荐
- Redis数据存储和读写
今天工作群里,有小伙伴问了一个问题,从Redis获取的数据,一会是0,一会是OK. 这引起了我们对Redis数据存储和读写的疑问. 以下是整理的一些技术研究内容. 在 Redis 中,所有的数据存储都 ...
- python-使用百度AipOcr实现表格文字图片识别
注:本博客中的代码实现来自百度问答:https://jingyan.baidu.com/article/c1a3101ef9131c9e646deb5c.html 代码运行环境:win10 pyth ...
- Github 如何查看自己的 star 和 fork
最近在 github 上看到偶尔有几个项目被 fork,心里也是挺开心的,但是查看项目的 fork 和 star,网上没有一个具体的教程,都是一个模板各种抄,本文就详细介绍如何查看. 查看 fork ...
- 一文带你搞清楚Python的多线程和多进程
本文分享自华为云社区<Python中的多线程与多进程编程大全[python指南]>,作者:柠檬味拥抱. Python作为一种高级编程语言,提供了多种并发编程的方式,其中多线程与多进程是最常 ...
- xxlJob Cron表达式 0 0 8,13 * * ?
xxlJob Cron表达式 0 0 8,13 * * ? Cron有如下两种语法格式:(1)Seconds Minutes Hours DayofMonth Month DayofWeek Yea ...
- python重拾第九天-进程、线程、协程
本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...
- 掉了两根头发后,我悟了!vue3的scoped原来是这样避免样式污染(上)
前言 众所周知,在vue中使用scoped可以避免父组件的样式渗透到子组件中.使用了scoped后会给html增加自定义属性data-v-x,同时会给组件内CSS选择器添加对应的属性选择器[data- ...
- Linux 内核:设备驱动模型(3)class与device
Linux 内核:设备驱动模型(3)class与device 背景 前面我们知道了设备如何通过总线与驱动匹配,也了解了设备插拔时与用户空间是如何通过uevent基于环境变量进行交互的. 前面看过了设备 ...
- centos如何统计磁盘使用总量,以及cpu使用率
剩余硬盘容量 T: df | awk '{print $4}' |sed 's/Available//g' |sed '/^\s*$/d' | awk '{sum+=$1} END {print su ...
- “科来杯”第九届山东省大学生网络安全技能大赛决赛部分wp
1.损坏的流量包 wireshark打不开,丢进winhex里,找关键字flag 哎,没找到. 那就仔细看看,在最后发现一串类似base64的密文 base64解密 得到flag 2.签到题 一个 ...