安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

利用Vue自定义指令让你的开发变得更优雅

11月7日 程染筱投稿
  前段时间在用框架开发H5页面时,碰到框架中的组件内置了一个属性用于适配异形屏,虽然是组件内部实现的,但这个方式让我萌生一个想法:能不能自己写一个属性来实现这样的功能?
  经过一番思索,我发现Vue的指令模式就很像属性的写法,在Vue中,我们利用模板指令诸如vifvfor等完成了许多工作,而Vue同样也支持自定义属性:constappVue。createApp({})注册一个全局自定义指令vfocusapp。directive(focus,{当被绑定的元素挂载到DOM中时mounted(el){聚焦元素el。focus()}})
  然后你可以在模板中任何元素上使用新的vfocusattribute,如下inputvfocus
  注:这里除了全局注册,也可以采用局部注册的方式,实际开发中可以使用vue另一项方便的功能mixin来将对应的指令混入你想使用的文件中,以达到代码的复用,那么开始进入正题吧。底部安全区适配
  首先页面必须在head标签中添加meta标签,并设置viewportfitcover值directives:{safeAreaBottom:{bind(el,binding){constaddHighbinding。value0el。setAttribute(style,el。style。cssTextpaddingbottom:calc({addHigh}constant(safeareainsetbottom));paddingbottom:calc({addHigh}env(safeareainsetbottom)););}}}
  使用:
  如果设计图本身存在一个边距,则可以动态适配:
  是不是很方便?我们再来看看另一个移动端H5会遇到的问题,并且还是用Vue指令来解决它。弹窗背景页不滚动
  在移动端开发中,页面弹出滚动窗口时,需要将背景页固定住不动,否则会出现滚动穿透的现象。touchScroll:{inserted(){constscrollTopdocument。body。scrollTopdocument。documentElement。scrollTdocument。body。style。cssTextposition:width:100;top:scrollT;},unbind(){constbodydocument。bodydocument。documentEbody。style。consttopbody。style。document。body。scrollTopdocument。documentElement。scrollTopparseInt(top,10);body。style。}}是的,我是一个弹窗,当我出现时我的背景会吓得不敢动实现一个copy工具
  有时我们需要页面点击可以一键复制的功能,可能大家都有用到一个叫vueclipboard的库,知道了指令的使用,实现一个copy自然也不在话下,那么就自己动手写一个vueCopy,为今后开发项目减少一个第三方库的使用吧。
  首先我们看看这个工具是怎么使用的:
  可以看出作者也是利用了指令,就照他这个思路,动手撸了一个,这里就直接上代码了,具体思路点见注释:clipboard:{bind(el,binding,{context}){constthiscontext利用arg用来注入回调函数if(binding。argsuccess){this。clipboardSuccessthis〔binding。expression〕}elseif(binding。argerror){this。clipboardErrorthis〔binding。expression〕}else{正常情况下就将文字缓存起来this。clipboardValuebinding。value}el。handler(){if(!this。clipboardValue){this。clipboardErrorthis。clipboardError(无内容)return}if(binding。arg){这里是因为属性被我们用了多次会多次执行,所以限制了执行次数return}try{consttextareadocument。createElement(textarea)textarea。readOnlyreadonly禁止输入,readonly防止手机端错误聚焦自动唤起键盘textarea。setAttribute(style,position:top:9999left:9999)它是可见的,但它又是不可见的textarea。valuebinding。valuedocument。body。appendChild(textarea)textarea。select()constresultdocument。execCommand(Copy)if(result){this。clipboardSuccessthis。clipboardSuccess(binding。value)这里可以定义成功回调返回的数据}document。body。removeChild(textarea)}catch(e){this。clipboardErrorthis。clipboardError(e)}}el。addEventListener(click,el。handler)},componentUpdated(el,{arg,value},{context}){更新值时候触发constthiscontextif(!arg){注册回调的部分不要赋值this。clipboardValuevalue}},unbind(el){el。removeEventListener(click,el。handler)},}
  简单使用:点击直接复制到剪贴板
  带回调的使用:templatecopycopyTexttemplate表单防止重复提交设置vthrottle自定义指令Vue。directive(throttle,{bind:(el,binding){letthrottleTimebinding。节流时间if(!throttleTime){用户若不设置节流时间,则默认2sthrottleTime2000;}letcbFel。addEventListener(click,event{if(!cbFun){第一次执行cbFunsetTimeout((){cbF},throttleTime);}else{eventevent。stopImmediatePropagation();}},true);},});
  使用:buttonclicksayHellovthrottle提交button图片懒加载constLazyLoad{install方法install(Vue,options){代替图片的loading图letdefaultSrcoptions。Vue。directive(lazy,{bind(el,binding){LazyLoad。init(el,binding。value,defaultSrc);},inserted(el){兼容处理if(IntersectionObserverinwindow){LazyLoad。observe(el);}else{LazyLoad。listenerScroll(el);}},})},初始化init(el,val,def){datasrc储存真实srcel。setAttribute(datasrc,val);设置src为loading图el。setAttribute(src,def);},利用IntersectionObserver监听elobserve(el){letionewIntersectionObserver(entries{letrealSrcel。dataset。if(entries〔0〕。isIntersecting){if(realSrc){el。srcrealSel。removeAttribute(datasrc);}}});io。observe(el);},监听scroll事件listenerScroll(el){lethandlerLazyLoad。throttle(LazyLoad。load,300);LazyLoad。load(el);window。addEventListener(scroll,(){handler(el);});},加载真实图片load(el){letwindowHeightdocument。documentElement。clientHeightletelTopel。getBoundingClientRect()。letelBtmel。getBoundingClientRect()。letrealSrcel。dataset。if(elTopwindowHeight0elBtm0){if(realSrc){el。srcrealSel。removeAttribute(datasrc);}}},节流throttle(fn,delay){letprevTreturnfunction(。。。args){letcurrTimeDate。now();if(!prevTime)prevTimecurrTclearTimeout(timer);if(currTimeprevTimedelay){prevTimecurrTfn。apply(context,args);clearTimeout(timer);}timersetTimeout(function(){prevTimeDate。now();fn。apply(context,args);},delay);}}}exportdefaultLazyL
  以上就是文章的全部内容,希望对你有所帮助!如果觉得文章写的不错,可以点赞收藏,也欢迎关注,我会持续更新更多前端有用的知识与实用技巧,我是茶无味de一天,希望与你共同成长
投诉 评论

这个小镇,700多年不修公路,不买汽车,却美翻了天幽静的运河缓缓流淌,两岸一栋栋小屋伴河而建,没有鸣笛声却常被鸟鸣唤醒,没有汽车却随处可见河中一叶叶小舟。这并不是只有童话里才有的生活,这是一个一旦坠入就难以自拔的梦。……(体育)三国围棋擂台赛范廷钰赢得开门红新华社北京10月11日电中国围棋协会消息,11日在线上进行的第24届农心辛拉面杯世界围棋团体锦标赛(简称三国围棋擂台赛)揭幕战中,中国队先锋范廷钰九段执白180手中盘战胜日本队……蹦床女神何雯娜嫁二婚富豪老公,被婆婆针对,今一家三口很幸福近日,蹦床女神何雯娜得到了部分媒体的关注,她在嫁人之后一直保持着不错的曝光度,和自己的丈夫感情甜蜜,两人此前也参加了一档综艺节目,不过在综艺节目中却暴露了一个非常残忍的事实,那……遭拜仁连13次拒绝,压哨离队可能性极低,C罗道路越走越窄了?在新赛季英超联赛第3轮比赛中,曼联21战胜了利物浦,同时也迎来了新赛季首场胜利。此外曼联还有一点是非常引人关注的,那就是沦为替补的C罗能否在今夏转会窗口关闭前离队,不过可能性已……周末宜囤精神食粮,盘点10本适合宅家阅读的书最近,大家忙着团购、带娃、居家办公,也许已经很久没有静下来好好读一本书了。今天,小编为大家盘点了10本适合宅家阅读的书:它们有的涨姿势,也许能为您提供一个理解这个世……vivo自研芯片下放?曝iQOO10系列搭载自研V1ISP芯【手机中国新闻】目前,有不少国产手机厂商都在探索自研芯片的道路,已经有不少相关的产品问世,搭载在了各家的产品上。2021年9月份,vivo正式发布了旗下的自研专业影像芯片V1,……利用Vue自定义指令让你的开发变得更优雅前段时间在用框架开发H5页面时,碰到框架中的组件内置了一个属性用于适配异形屏,虽然是组件内部实现的,但这个方式让我萌生一个想法:能不能自己写一个属性来实现这样的功能?经过……进入一个放松的世界自然之旅VR(NatureTreksVR)进入一个放松的世界自然之旅VR(NatureTreksVR)大家好,我是痴迷VR世界,吹爆机皇Quest的幻境流浪汉白马,有好玩的,不分享怎么行,为你献上好玩的有用的VR……银保监会人事再调整新设内审局,五位部门正职履新近期,银保监会对内陆续宣布多个司局级人事任命,不过与前一段时间的中层人事调整逻辑主要在于轮岗等不同(详见《银保监中层干部大轮岗,银行跨界监管保险的理念碰撞这才刚刚开始》),这一……我国成功发射遥感三十五号04组卫星8月20日1时37分,我国在西昌卫星发射中心使用长征二号丁运载火箭,成功将遥感三十五号04组卫星发射升空。卫星顺利进入预定轨道,发射任务获得圆满成功。新华社发(应龙飞摄)……舆情速递丨全国已有10余个城市允许自动驾驶汽车商业化试运营头条全国已有10余个城市允许自动驾驶汽车商业化试运营在8月25日举行的交通运输部例行新闻发布会上,交通运输部运输服务司副司长韩敬华介绍,目前,全国已有10余个城市允……梅开二度,帽子戏法!广州队18岁小将,闪耀克罗地亚,国青两连今天晚上19:30,广州队将迎来中超联赛第13轮的补赛,对手是刚刚解除转会禁令的大连人队。即便大连人目前已经解除了转会禁令,引进了多名内外援。但是,由于郑智的回归,给广州队带来……
孙准浩预计12日重返中国能赶上与海港国安比赛地产新闻联播丨银保监会坚决压降影子银行风险突出的融资类信托业火箭首位想离队前锋出炉,拉文迎好消息,马刺将102后卫摆上货机械手监控与预测性维护解决方案堪称生产制造者的福音中国队再夺4金!19岁天才少年闪耀世锦赛,赛制对中国选手不公上海自驾3h,溧阳山湖竹海间庭院民宿丨南山竹海DateOne陈萌提出生娃条件?大衣哥无奈应允,网友又要人财两空了风控模型应聘,80会被问到的面试题生死面前,一切都是小事荣耀X50Max曝光,16G512G5500mAh7分险胜!八连胜代表不了什么,但是哈登的心声却说明了一切你早餐喝粥吗?早餐喝粥饮食健康吗?怎样喝粥才健康?女性节食减肥会导致失眠吗用小指造句产科医生告知产后满月发汗很重要,可以促进身体恢复,月子里怎样今年春来早,化除宜提前哈登能否夺冠就看这笔交易了!威金斯与76人2换1方案流言传出圣诞节几月几号(圣诞节)家里蝎子如何根除为人处世的基本技巧学会关心和帮助他人小孩子怎么教育小孩子如何教育有关跳绳比赛的作文200字5篇耙耳朵五问蓉足意如何缓解年末压力的靠谱建议

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利