专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

前端在Vue3这样子写页面更快更高效

  前言
  在开发管理后台过程中,一定会遇到不少了增删改查页面,而这些页面的逻辑大多都是相同的,如获取列表数据,分页,筛选功能这些基本功能。而不同的是呈现出来的数据项。还有一些操作按钮。
  对于刚开始只有1,2个页面的时候大多数开发者可能会直接将之前的页面代码再拷贝多一份出来,而随着项目的推进类似页面数量可能会越来越多,这直接导致项目代码耦合度越来越高。
  这也是为什么在项目中一些可复用的函数或组件要抽离出来的主要原因之一
  下面,我们封装一个通用的useList,适配大多数增删改查的列表页面,让你更快更高效的完成任务,准点下班
  前置知识VueVueCompositionApi封装
  我们需要将一些通用的参数和函数抽离出来,封装成一个通用hook,后续在其他页面复用相同功能更加简单方便。定义列表页面必不可少的分页数据exportdefaultfunctionuseList(){加载态constloadingref(false);当前页constcurPageref(1);总数量consttotalref(0);分页大小constpageSizeref(10);}如何获取列表数据
  思考一番,让useList函数接收一个listRequestFn参数,用于请求列表中的数据。
  定义一个list变量,用于存放网络请求回来的数据内容,由于在内部无法直接确定列表数据类型,通过泛型的方式让外部提供列表数据类型。exportdefaultfunctionuseListItemTypeextendsObject(listRequestFn:Function){忽略其他代码constlistrefItemType〔〕(〔〕);}
  在useList中创建一个loadData函数,用于调用获取数据函数,该函数接收一个参数用于获取指定页数的数据(可选,默认为curPage的值)。执行流程设置加载状态调用外部传入的函数,将获取到的数据赋值到list和total中关闭加载态
  这里使用了asyncawait语法,假设请求出错、解构出错情况会走catch代码块,再关闭加载态
  这里需要注意,传入的listRequestFn函数接收的参数数量和类型是否正常对应上请根据实际情况进行调整exportdefaultfunctionuseListItemTypeextendsObject(listRequestFn:Function){忽略其他代码数据constlistrefItemType〔〕(〔〕);过滤数据获取列表数据constloadDataasync(pagecurPage。value){设置加载中loading。valuetrue;try{const{data,meta:{total:count},}awaitlistRequestFn(pageSize。value,page);list。valuedata;total。valuecount;}catch(error){console。log(请求出错了,error);}finally{关闭加载中loading。valuefalse;}};}
  别忘了,还有切换分页要处理
  使用watch函数监听数据,当curPage,pageSize的值发生改变时调用loadData函数获取新的数据。exportdefaultfunctionuseListItemTypeextendsObject(listRequestFn:Function){忽略其他代码监听分页数据改变watch(〔curPage,pageSize〕,(){loadData(curPage。value);});}
  现在实现了基本的列表数据获取实现数据筛选器
  在庞大的数据列表中,数据筛选是必不可少的功能
  通常,我会将筛选条件字段定义在一个ref中,在请求时将ref丢到请求函数即可。
  在useList函数中,第二个参数接收一个filterOption对象,对应列表中的筛选条件字段。
  调整一下loadData函数,在请求函数中传入filterOption对象即可
  注意,传入的listRequestFn函数接收的参数数量和类型是否正常对应上请根据实际情况进行调整exportdefaultfunctionuseListItemTypeextendsObject,FilterOptionextendsObject(listRequestFn:Function,filterOption:RefObject){constloadDataasync(pagecurPage。value){设置加载中loading。valuetrue;try{const{data,meta:{total:count},}awaitlistRequestFn(pageSize。value,page,filterOption。value);list。valuedata;total。valuecount;}catch(error){console。log(请求出错了,error);}finally{关闭加载中loading。valuefalse;}};}
  注意,这里filterOption参数类型需要的是ref类型,否则会丢失响应式无法正常工作清空筛选器字段
  在页面中,有一个重置的按钮,用于清空筛选条件。这个重复的动作可以交给reset函数处理。
  通过使用Reflect将所有值设定为undefined,再重新请求一次数据。
  什么是Reflect?看看这一篇文章Reflect映射对象exportdefaultfunctionuseListItemTypeextendsObject,FilterOptionextendsObject(listRequestFn:Function,filterOption:RefObject){constreset(){if(!filterOption。value)return;constkeysReflect。ownKeys(filterOption。value);filterOption。value{}asFilterOption;keys。forEach((key){Reflect。set(filterOption。value!,key,undefined);});loadData();};}导出功能
  除了对数据的查看,有些界面还需要有导出数据功能(例如导出csv,excel文件),我们也把导出功能写到useList里
  通常,导出功能是调用后端提供的导出Api获取一个文件下载地址,和loadData函数类似,从外部获取exportRequestFn函数来调用Api
  在函数中,新增一个exportFile函数调用它。exportdefaultfunctionuseListItemTypeextendsObject,FilterOptionextendsObject(listRequestFn:Function,filterOption:RefObject,exportRequestFn?:Function){忽略其他代码constexportFileasync(){if(!exportRequestFn){thrownewError(当前没有提供exportRequestFn函数);}if(typeofexportRequestFn!function){thrownewError(exportRequestFn必须是一个函数);}try{const{data:{link},}awaitexportRequestFn(filterOption。value);window。open(link);}catch(error){console。log(导出失败,error);}};}
  注意,传入的exportRequestFn函数接收的参数数量和类型是否正常对应上请根据实际情况进行调整优化
  现在,整个useList已经满足了页面上的需求了,拥有了获取数据,筛选数据,导出数据,分页功能
  还有一些细节方面,在上面所有代码中的try。。catch中的catch代码片段并没有做任何的处理,只是简单的console。log一下提供钩子
  在useList新增一个Options对象参数,用于函数成功、失败时执行指定钩子函数与输出消息内容。定义Options类型exportinterfaceMessageType{GETDATAIFFAILED?:string;GETDATAIFSUCCEED?:string;EXPORTDATAIFFAILED?:string;EXPORTDATAIFSUCCEED?:string;}exportinterfaceOptionsType{requestError?:()void;requestSuccess?:()void;message:MessageType;}exportdefaultfunctionuseListItemTypeextendsObject,FilterOptionextendsObject(listRequestFn:Function,filterOption:RefObject,exportRequestFn?:Function,options?:OptionsType){。。。}设置Options默认值constDEFAULTMESSAGE{GETDATAIFFAILED:获取列表数据失败,EXPORTDATAIFFAILED:导出数据失败,};constDEFAULTOPTIONS:OptionsType{message:DEFAULTMESSAGE,};exportdefaultfunctionuseListItemTypeextendsObject,FilterOptionextendsObject(listRequestFn:Function,filterOption:RefObject,exportRequestFn?:Function,optionsDEFAULTOPTIONS){。。。}
  在没有传递钩子的情况霞,推荐设置默认的失败时信息显示优化loadData,exportFile函数
  基于elementui封装message方法import{ElMessage,MessageOptions}fromelementplus;exportfunctionmessage(message:string,option?:MessageOptions){ElMessage({message,。。。option});}exportfunctionwarningMessage(message:string,option?:MessageOptions){ElMessage({message,。。。option,type:warning});}exportfunctionerrorMessage(message:string,option?:MessageOptions){ElMessage({message,。。。option,type:error});}exportfunctioninfoMessage(message:string,option?:MessageOptions){ElMessage({message,。。。option,type:info});}
  loadData函数constloadDataasync(pagecurPage。value){loading。valuetrue;try{const{data,meta:{total:count},}awaitlistRequestFn(pageSize。value,page,filterOption。value);list。valuedata;total。valuecount;执行成功钩子options?。message?。GETDATAIFSUCCEEDmessage(options。message。GETDATAIFSUCCEED);options?。requestSuccess?。();}catch(error){options?。message?。GETDATAIFFAILEDerrorMessage(options。message。GETDATAIFFAILED);执行失败钩子options?。requestError?。();}finally{loading。valuefalse;}};
  exportFile函数constexportFileasync(){if(!exportRequestFn){thrownewError(当前没有提供exportRequestFn函数);}if(typeofexportRequestFn!function){thrownewError(exportRequestFn必须是一个函数);}try{const{data:{link},}awaitexportRequestFn(filterOption。value);window。open(link);显示信息options?。message?。EXPORTDATAIFSUCCEEDmessage(options。message。EXPORTDATAIFSUCCEED);执行成功钩子options?。exportSuccess?。();}catch(error){显示信息options?。message?。EXPORTDATAIFFAILEDerrorMessage(options。message。EXPORTDATAIFFAILED);执行失败钩子options?。exportError?。();}};useList使用方法templateelcollapseclassmb6elcollapseitemtitle筛选条件name1elformlabelpositionleftlabelwidth90px:modelfilterOptionelrow:gutter20elcol:xs24:sm12:md8:lg8:xl8elformitemlabel用户名elinputvmodelfilterOption。nameplaceholder筛选指定签名名称elformitemelcolelcol:xs24:sm12:md8:lg8:xl8elformitemlabel注册时间eldatepickervmodelfilterOption。timeRangetypedaterangeunlinkpanelsrangeseparator到startplaceholder开始时间endplaceholder结束时间formatYYYYMMDDHH:mmvalueformatYYYYMMDDHH:mmelformitemelcolelcol:xs24:sm24:md24:lg24:xl24elrowclassflexmt4elbuttontypeprimaryclickfilter筛选elbuttonelbuttontypeprimaryclickreset重置elbuttonelrowelcolelrowelformelcollapseitemelcollapseeltablevloadingloading:datalistborderstylewidth:100eltablecolumnlabel用户名minwidth110pxtemplatedefaultscope{{scope。row。name}}templateeltablecolumneltablecolumnlabel手机号码minwidth130pxtemplatedefaultscope{{scope。row。mobile未绑定手机号码}}templateeltablecolumneltablecolumnlabel邮箱地址minwidth130pxtemplatedefaultscope{{scope。row。email未绑定邮箱地址}}templateeltablecolumneltablecolumnpropcreateAtlabel注册时间minwidth220pxeltablecolumnwidth200pxfixedrightlabel操作templatedefaultscopeelbuttontypeprimarylinkclickdetail(scope。row)详情elbuttontemplateeltablecolumneltable0classflexjustifyendmt4elpaginationvmodel:currentpagecurPagevmodel:pagesizepageSizebackgroundlayoutsizes,prev,pager,next:totaltotal:pagesizes〔10,30,50〕template
  本文useList的完整代码在github。comQC2168snip
  如果您对该hook有更好的建议,欢迎pr或者在评论区留言哦
  另外,为了在日常开发中节省找封装代码片段的时间和提高工作效率(摸时间),该仓库还存放一些第三方封装的代码片段,方便大家拿取(持续更新中)
  文章来源:islandhttps:juejin。cnpost7172889961446768670

想拜我为师不,荣荣送你回家泡温泉今天给大家介绍一下梦琪这个英雄,这个英雄前两个赛季被改版了。我刚开始玩这个英雄的时候,他的技能还不是这样的,技能有一定的改变,增加了灵活性!这个英雄的定位是法师坦克,价值13888热血传奇从端游到手游的蜕变,传奇一直在路上热血传奇这款游戏从发行至今已有二十个年头了,是众多80后90后甚至70后永远美好的回忆,放到现在依旧受到各类玩家的热爱,是国内永不消灭的经典之作!随着时代的发展,传奇也在为用户的体联合国秘书长古特雷斯北京冬奥可以团结大众,带来和平当地时间1月13日,联合国秘书长古特雷斯在回答中国记者提问时表示,他认为北京冬奥可以团结大众,带来和平,正是考虑到这个因素,他才决定要出席北京冬奥会开幕式。古特雷斯资料图新华社发联坦桑尼亚奥委会主席抵制奥运影响的是运动员们来源人民网国际频道原创稿坦桑尼亚奥委会主席奥运会银牌获得者菲尔伯特巴依(右)。图片来源坦桑尼亚奥委会官方Instagram账号2022北京冬奥进入倒计时,各国运动员都在为梦想努力着闹大了!德约科维奇被澳洲警察逮捕,打不打澳网已经没意义了1月15日,据多家媒体证实,世界排名第一的网球天王德约科维奇已经被澳洲边境管理机构逮捕。而这已经是他近十天以来遭遇的又一次非人的对待,对于一代球王而言,澳洲当地的做法确实太不像话了原神2022全年内容预测,将有3张新地图,17个新角色以及新玩法2021年已经接近尾声,原神今年的最后一个版本2。3版本也即将过半,虽说米哈游这一年来的阴间操作不少,但是起码每个版本策划的也还行,尤其是下半年的内容几乎可以说是巅峰时期,更新的内2022年高铁迎来大改,不仅降速还降温,其中原因很简单据统计,现阶段我国高铁全长达到4万公里,在国际上属于领先地位。专家预判,在高铁建造上投资1亿,生产总值就能增加1。8亿。可见,高铁发展对于我国经济有着至关重要的推动作用。更关键的是切尔西损失惨重英格兰电视转播权收入的增加,不足以弥补因Covid19大流行而造成的损失。根据20202021赛季财报,切尔西亏损1。97亿美元。这一数字与20192020赛季5300万的利润形成4个中成药,益肾健脾理气降逆润肠通便,改善脾胃,用于便秘便秘表现为大便次数减少排便困难粪便过硬等,常会伴有腹痛腹胀恶心口苦肛门疼痛排便不尽感心情烦躁等,给生活带来消极影响。在中医领域,便秘的发生与脏腑功能紊乱有着密切联系,由脾胃的运化功征战沙场,攻城掠地!万众期待的部落与弯刀正式版终于来了今天给大家推荐一款国产游戏部落与弯刀。这是一款支持创意工坊的开放世界游戏,这两个词条加在一块,可不是一加一等于二那么简单。和上古卷轴5类似,这款游戏的mod也是非常多的,堪称能带兵如虎添翼!太阳红箭曝2换1地震交易,三分王助保罗夺生涯首冠近日,根据HoopsHype记者MichaelScotto的报道,多支季后赛级别的球队在关注着火箭的埃里克戈登和丹尼尔泰斯。其中太阳对戈登非常感兴趣,有意在截止日前得到这位老将增强
致ChatGPT说说全体粉丝的一封信!亲爱的ChatGPT说说的全体粉丝们大家好,首先衷心感谢每一位关注和支持ChatGPT说说的粉丝朋友们。然而,今天我必须要和大家分享一个令人遗憾的消息。由于技术原因,我们ChatG索尼在专利中贬低其他主机制造商专利专家怒批其幼稚不专业索尼最近公布的一项专利中详细介绍了一种新通用控制器,它可以在主机和多种设备上工作。然而,该文件还奇怪地提到,所有不是PlayStation产品的东西都是劣等产品。该专利描述了索尼试迪丽热巴代言品牌广告涉嫌歧视,粉丝努力洗地,但这理由更招黑又来了!迪奥这个品牌,真的是死性不改。这次网友热议的焦点,指向了其彩妆代言人迪丽热巴,因为涉嫌歧视的广告,就是彩妆产品。近日,迪奥彩妆在外网的社交平台上发布几张广告图,又是熟悉的味关于景女士隐私视频日后会否泄露的几点看法李微敖于3月底4月初发布了几条张继科负面的信息,受到广大网友的关注。情况大致如下张继科因赌博负债累累,无力偿还,遂将前女友景女士的隐私视频抵押给武汉S先生。该先生认真仔细观看视频后孩子被暴力,妈妈怎么办很多人都觉得家暴离自己很遥远,其实不然。总觉得家暴虐待孩子的人都是继父后母,其实不然。家暴别人孩子的继父后母是畜牲,家暴自己孩子的亲生父母应该是畜牲不如!外人眼中的家暴与家人眼中的输球显人品!马龙输球后称赞对手,张本智和出局父子发声责备观众在昨晚的WTT冠军赛结束的赛事中,陈梦30战胜日本的石川佳纯,王曼昱30战胜巴西的高桥布鲁娜,而马龙则13输给了中国台北的林昀儒,止步于16强。反观日本男单,两人止步于首轮,而作为派拓网络发布勒索软件威胁报告,骚扰事件激增20倍全球网络安全领导企业PaloAltoNetworks(派拓网络)发布2023勒索软件威胁报告。报告指出,威胁情报小组Unit42的事件响应案例显示,攻击者正采取愈发激进的手段向企业拥抱AI等新技术,巨人网络AI游戏是公司未来重点布局方向(报告出品方分析师中信建投杨艾莉)1概况征途IP奠定基础,股权结构清晰稳定巨人网络成立于2004年,由史玉柱创立,主营游戏研发与运营,目前拥有征途系列与球球大作战两大核心产品线,分两部门发文力争到2025年我国旅游场所5G网络建设基本完善据工信微报公众号消息,为深入推进5G在旅游业的创新应用,赋能旅游业数字化网络化智能化转型升级,培育发展智慧旅游新业态新模式,推动5G智慧旅游协同创新发展,工业和信息化部联合文化和旅面向摄影师网络达人!寻找日照最美打卡地活动优惠措施出炉大众网海报新闻见习记者丁怡欣日照报道4月11日上午,日照市新闻办召开有一种生活叫日照主题系列发布会(第二场),介绍寻找日照最美打卡地活动有关情况并回答记者提问。据了解,寻找日照最美糖友日常饮食要避开哪些陷阱?民以食为天。糖友除了用药外,最关心的就是吃。糖尿病饮食的原则和宜忌,很多糖友表示已倒背如流,但是真正落实到日常生活的每一餐,还是存在不少偏差,需要时不时地来点t讲究食物选择相信糖友
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网