问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

使用CompositionApi封装业务hook的思路分享

发布网友 发布时间:2024-09-30 12:54

我来回答

1个回答

热心网友 时间:2024-11-17 00:29

前序

近期公司的新项目一个小程序,一直想尝试Vue3开发项目,苦于自己的驱动力不行,学的零零碎碎的。因此小程序我直接跟项目组长说我要使用uniapp的Vue3版进行开发。开发中遇到业务场景相同的,就分装了一个hook来减少代码,易于维护。

hook的场景

这种获取列表的需求很常见吧,在我这个小程序中有3处使用到了获取列表的功能。分别是:我的收藏、已投递岗位、未投递岗位。

当然展示岗位的card我是分装了一个组件,很简单的业务组件,这里也不会描述。

假如:我的收藏、已投递岗位、未投递岗位都各自获取列表,就会出现重复性的定义以下代码

constgetJobParameter=reactive<paramsType>({page:1,pageSize:10,code:null,releaseJobName:null,});constjobList=ref([]asArray<jobType>);consttotal=ref(0);onLoad(()=>{getlist();});onReachBottom(()=>{if(jobList.value.length<total.value){getJobParameter.page++;getlist();}});asyncfunctiongetlist(){constres:any=awaitfn(getJobParameter);jobList.value=await[...jobList.value,...res.data.data.dataList];total.value=res.data.data.total;}

3个页面都要写上:定义变量->初始获取->获取的代码判断->底部触发的代码。因此就直接分装了一个hook。

useGetJobList共同import{onLoad,onReachBottom}from'@dcloudio/uni-app';import{ref,reactive}from'vue';import{jobType}from'@/types/job-hunting';interfaceparamsType{page:number;pageSize:number;code:string|null;releaseJobName:string|null;}exportfunctionuseGetJobList(fn){constgetJobParameter=reactive<paramsType>({page:1,pageSize:10,code:null,releaseJobName:null,});constjobList=ref([]asArray<jobType>);consttotal=ref(0);onLoad(()=>{getlist();});onReachBottom(()=>{if(jobList.value.length<total.value){getJobParameter.page++;getlist();}});asyncfunctiongetlist(){constres:any=awaitfn(getJobParameter);jobList.value=await[...jobList.value,...res.data.data.dataList];total.value=res.data.data.total;}asyncfunctionrefresh(){getJobParameter.page=1;jobList.value=[];awaitgetlist();returntrue;}return{jobList,refresh:()=>refresh(),};}

已上代码就是简单的获取到岗位的list还未进行操作。

思路历程

因为首页有城市的选择、岗位的搜索等功能。

下面是我开始时的想法(错误):

我想着要不把getJobParameter的参数全部暴露出去,然后对这些参数进行操作,但是内心感觉怪怪的,这样跟不分装好像区别也不大,又思考要不在useGetJobList加一个参数用来传递参数的变化,当然这个也是行不通的。

后面看了别人分装的hook。就有了以下代码。

import{onLoad,onReachBottom}from'@dcloudio/uni-app';import{ref,reactive}from'vue';import{jobType}from'@/types/job-hunting';interfaceparamsType{page:number;pageSize:number;code:string|null;releaseJobName:string|null;}exportfunctionuseGetJobList(fn){constgetJobParameter=reactive<paramsType>({page:1,pageSize:10,code:null,releaseJobName:null,});constjobList=ref([]asArray<jobType>);consttotal=ref(0);onLoad(()=>{getlist();});onReachBottom(()=>{if(jobList.value.length<total.value){getJobParameter.page++;getlist();}});asyncfunctiongetlist(){constres:any=awaitfn(getJobParameter);jobList.value=await[...jobList.value,...res.data.data.dataList];total.value=res.data.data.total;}asyncfunctionrefresh(){getJobParameter.page=1;jobList.value=[];awaitgetlist();//这个后面的代表异步了returntrue;}functionreset(){getJobParameter.page=1;getJobParameter.code=null;getJobParameter.releaseJobName=null;}functionqueryList(searchValue:string|null){reset();getJobParameter.releaseJobName=searchValue;getlist();}functioncodeChange(code:string|null){reset();getJobParameter.code=code;getlist();}return{jobList,queryList:(searchValue:string|null)=>queryList(searchValue),codeChange:(code:string|null)=>codeChange(code),refresh:()=>refresh(),};}

这里为重新定两个函数分别是queryList、codeChange,用来搜索和城市code改变再获取岗位列表。

queryList:(searchValue:string|null)=>queryList(searchValue),codeChange:(code:string|null)=>codeChange(code),

上面代码还有一个心得,就是在return是可以直接把函数写为什么要再分装一个函数出来?

心得

当定义了一个hook,当外部使用想改变hook内部的变量,内部写个函数暴露出去,函数的内部是对变量的修改,外部只需要使用暴露函数。这样代码十分的清晰易懂。

return再分装一个函数是为了后期别人看代码是可以一眼就知道返回哪些是变量,哪些是函数,函数有哪些参数,参数的类型等之类的,不用一个的去查找。

utils和hook的区别

之前我一直搞不清楚hook和utils的区别,我感觉差不多都是分装一个函数出来。

区别:?utils是一个简单的参数传入,然后返回,返回的变量不具有响应式。没有使用到Vue的reactive、ref等钩子函数,我认为当你使用了这些钩子函数就可以说它是一个hook。

总结

hook有点想面向对象的语言的class,内部定义的变量,最好自己内部的做处理,只需暴露出一个函数。

当定义了一个hook,当外部使用想改变hook内部的变量就因此写一个函数暴露出去,进行变量的更改

return再分装一个函数是为了后期别人看代码是可以一眼就知道返回哪些是变量,哪些是函数,函数有哪些参数,参数的类型等之类的,不用一个的去查找。

最后

这里是个人的心得与体会,有错的地方请大佬们指教,目前正向着钩子开发进军。当然大佬们有好的分装思想,请教教小弟,跪求。

原文:https://juejin.cn/post/7103364144576856094
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
手机导航地图语音怎么下载 如何分别真金和仿金首饰 怎样区分真金和仿金首饰呢 小学生新年晚会主持人的串词!!(不要太多)急 大大后天就需要了!!!_百度... 周年晚会策划公司 奥格瑞玛传送门大厅在哪 奥格瑞玛传送门大厅怎么走 锻炼颈椎的几个动作 水多久能结冰 冰能在多长时间内形成 请问水低于0度会结冰吗? 如何防止脱发严重 被偏爱的总有恃无恐,是什么歌里的歌词,拜托各位了 3Q 我国增值税实行什么制 五月鲜豆角有什么家常做法分享? 什么是增值税增值率 Webpack原理系列之彻底搞懂loader原理 ...被人追杀,而自己却会飞,这预示着什么?拜托各位大神 为什么我经常梦见被追杀或被追着打,却每次都能成功的逃脱.拜托各位了 3... hookup函数使用方法 拼多多新手场景直通车(拼多多直通车多多场景怎么开) 拼多多新手必了解的10个知识点 拼多多开车一天多少钱?有几单才可以停? 拼多多新手开车怎么出价?低客单价能开车吗? 决定污水处理设备价格的因素有哪些 老公贷款买车老婆征信有问题会影响吗 婚后贷款买车需要夫妻双方签字吗... 我想快速办理招行信用卡,但没时间,有什么办法可以联系到的吗?_百度... 备孕期间能吃玉米吗,这个一天可以吃多少 “闺风首邦族”的出处是哪里 风闺的词语风闺的词语是什么 怎样在xp下安装win98 ...在装一个windows 98 就是一台电脑两个操作系统 请问怎么装... 就是Vue的知识点而已 ...下,为什么亚连会说他要当千年伯爵?拜托各位了 3Q 在100以内(包括100)的自然数中,有25个质数,那么合数的个数是() (1... 妆前乳和隔离霜哪个先用 妆前乳和隔离霜的区别 防晒隔离和妆前乳的顺序 100以内因数只有1和它自己的自然数 2/7&lt;13/a&lt;1/3则式中a为100以内的自然数有几个 世界上最小的熊是什么 世界上最小的熊只有150厘米 天正软件与CAD有什么区别呢? 贸易经济专业有什么就业方向可以选择? 贸易经济专业主要就业方向是什么 毕业以后工资高吗 国际经济与贸易专业学什么 就业前景怎么样 经济贸易学出来干嘛的 做什么工作 贸易经济专业学什么 具体课程内容 求百度文库vip账号帮忙下载个文件,谢谢! 百度VIP文库帐号共享 QQ农牧场界面太小怎么办 西红柿可以壮阳吗?西红柿还有哪些功效是我们不知道的! 空调匹数与功率的关系??? 疯狂农场3怎么不全屏