城市直播房产教育博客汽车
快传网
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

利用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轮的补赛,对手是刚刚解除转会禁令的大连人队。即便大连人目前已经解除了转会禁令,引进了多名内外援。但是,由于郑智的回归,给广州队带来……
那些年用过的优秀洋垃圾手机伸舌自测看看自己是什么体质国庆怎么玩?来秀屿这份攻略让你的假期五彩缤纷三国群英2你最喜欢哪些组合?OPPK9PRO用户评价配置参数新版本AJ1首次曝光!颜值你打几分?小婴儿的心眼中国身价10亿美金富豪的数量居世界首位,啥时候先富带动后富?三星发布GalaxyZFold4,首款搭载安卓12L的可折叠360组合正式解体?湖人签约2415冠军后卫,詹姆斯附加赛稳希望在朝阳,希望也在孩子们身上天水和陇南,这两座甘肃城市,谁才是真正的陇上江南
美丽的千岛湖儿童版电影机,趣学伴绘本故事机放映机,启蒙更生动微信听筒模式怎么开启美的电磁炉通电不加热怎么回事电磁炉通电不加热的原因详解首都媒体跑团2018倡议书企业党员公开承诺书四季改变了我400字作文一件小事热博聚热点网 翅片管式换热器有什么好翅片管式换热器原理及特点介绍挪用资金罪十万的量刑标准是什么轮胎开始赚钱了,“暴利”还远吗?热传聚热点网 李若彤哪像奔六的人?穿波点裙配双运动鞋,看上去减龄又时髦

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁