十分钟,让你学会Vue的这些巧妙冷技巧
前言
写了两年的Vue,期间学习到好几个提高开发效率和性能的技巧,现在把这些技巧用文章的形式总结下来。1。巧用attrs和listeners
attrs用于记录从父组件传入子组件的所有不被props捕获以及不是class与style的参数,而listeners用于记录从父组件传入的所有不含。native修饰器的事件。那下面的代码作例子:Vue。component(child,{props:〔title〕,template:h3{{title}}h3})newVue({data:{a:1,title:title},methods:{handleClick(){。。。},handleChange(){。。。}},template:childclasschildwidth:aab1:titletitleclick。nativehandleClickchangehandleChange,})
则在在中attrs的值为{a:1,b:1}listeners的值为{change:handleChange}
通常我们可以用attrs和listeners作组件通信,在二次封装组件中使用时比较高效,如:Vue。component(customdialog,{通过vbindattrs和vonlisteners把父组件传入的参数和事件都注入到eldialog实例上template:eldialogvbindattrsvonlistenerseldialog,});newVue({data:{visible:false},这样子就可以像在eldialog一样用visible控制customdialog的显示和消失template:customdialog:visible。syncvisible,});
再举个例子:Vue。component(customselect,{template:elselectvbindattrsvonlistenerseloptionvalue选项1label黄金糕eloptionvalue选项2label双皮奶elselect,});newVue({data:{value:},vmodel在这里其实是vbind:value和von:change的组合,在customselect里,通过vbindattrsvonlisteners的注入,把父组件上的value值双向绑定到customselect组件里的elselect上,相当于elselectvmodelvalue与此同时,在customselect注入的size变量也会通过vbindattrs注入到elselect上,从而控制elselect的大小template:customselectvmodelvaluesizesmall,});2。巧用props
porps用于记录从父组件传入子组件的所有被props捕获以及不是class与style的参数。如Vue。component(child,{props:〔title〕,template:h3{{title}}h3})newVue({data:{a:1,title:title},methods:{handleClick(){。。。},handleChange(){。。。}},template:childclasschildwidth:aab1:titletitle,})
则在在中,props的值为{title:title}。props可以用于自组件和孙组件定义的props都相同的情况,如:Vue。component(grandchild,{props:〔a,b〕,template:h3{{ab}}h3})child和grandchild都需要用到来自父组件的a与b的值时,在child中可以通过vbindprops迅速把a与b注入到grandchild里Vue。component(child,{props:〔a,b〕,template:{{a}}加{{b}}的和是:grandchildvbindprops})newVue({template:childclasschildwidth:a1:b2,})3。妙用函数式组件
函数式组件相比于一般的vue组件而言,最大的区别是非响应式的。它不会监听任何数据,也没有实例(因此没有状态,意味着不存在诸如created,mounted的生命周期)。好处是因只是函数,故渲染开销也低很多。
把开头的例子改成函数式组件,代码如下:4。妙用Vue。config。devtools
其实我们在生产环境下也可以调用vuedevtools去进行调试,只要更改Vue。config。devtools配置既可,如下所示:务必在加载Vue之后,立即同步设置以下内容该配置项在开发版本默认为true,生产版本默认为falseVue。config。devtoolstrue;
我们可以通过检测cookie里的用户角色信息去决定是否开启该配置项,从而提高线上bug查找的便利性。5。妙用methods
Vue中的method可以赋值为高阶函数返回的结果,例如:
上面的search函数赋值为debounce返回的结果,也就是具有防抖功能的请求函数。这种方式可以避免我们在组件里要自己写一遍防抖逻辑。
这里有个例子sandbox,大家可以点进去看看经过高阶函数处理的method与原始method的效果区别,如下所示:
除此之外,method还可以定义为生成器,如果我们有个函数需要执行时很强调顺序,而且需要在data里定义变量来记录上一次的状态,则可以考虑用生成器。
例如有个很常见的场景:微信的视频通话在接通的时候会显示计时器来记录通话时间,这个通话时间需要每秒更新一次,即获取通话时间的函数需要每秒执行一次,如果写成普通函数则需要在data里存放记录时间的变量。但如果用生成器则能很巧妙地解决,如下所示:templateh3{{timeFormat}}h3template
页面效果如下所示:
代码地址:codesandbox
但需要注意的是:method不能是箭头函数
注意,不应该使用箭头函数来定义method函数(例如plus:()this。a)。理由是箭头函数绑定了父级作用域的上下文,所以this将不会按照期望指向Vue实例,this。a将是undefined。6。妙用watch的数组格式
很多开发者会在watch中某一个变量的handler里调用多个操作,如下所示:
虽然fn1和fn2都需要在value变动的时候调用,但两者的调用时机可能不同。fn1可能仅需要在deep为false的配置下调用既可。因此,Vue在watch的值添加了Array类型来针对上面所说的情况,如果用watch为Array的写法处理可以写成下面这种形式:7。妙用options
options是一个记录当前Vue组件的初始化属性选项。通常开发中,我们想把data里的某个值重置为初始化时候的值,可以像下面这么写:this。valuethis。options。data()。value;
这样子就可以在初始值由于需求需要更改时,只在data中更改即可。
这里再举一个场景:一个eldialog中有一个elform,我们要求每次打开eldialog时都要重置elform里的数据,则可以这么写:templateelbuttonclickvisible!visible打开弹窗elbuttoneldialogopeninitFormtitle个人资料:visible。syncvisibleelformelformitemlabel名称elinputvmodelform。nameelformitemelformitemlabel性别elradiogroupvmodelform。genderelradiolabelmale男elradioelradiolabelfemale女elradioelradiogroupelformitemelformeldialogtemplate
每次eldialog打开之前都会调用其open中的方法initForm,从而重置form值到初始值。如下效果所示:
以上代码放在sanbox里
如果要重置data里的所有值,可以像下面这么写:Object。assign(this。data,this。options。data());注意千万不要写成下面的样子,这样子就更改this。data的指向。使得其指向另外的与组件脱离的状态this。datathis。options。data();8。妙用vpre,voncevpre
vpre用于跳过被标记的元素以及其子元素的编译过程,如果一个元素自身及其自元素非常打,而又不带任何与Vue相关的响应式逻辑,那么可以用vpre标记。标记后效果如下:
vonce
只渲染元素和组件一次。随后的重新渲染,元素组件及其所有的子节点将被视为静态内容并跳过。这可以用于优化更新性能。
对于部分在首次渲染后就不会再有响应式变化的元素,可以用vonce属性去标记,如下:elselecteloptionvforiteminoptionsvonce:keyitem。value:labelitem。label:valueitem。value{{i}}eloptionelselect
如果上述例子中的变量options很大且不会再有响应式变化,那么如例子中用上vonce对性能有提升。9。妙用hook事件
如果想监听子组件的生命周期时,可以像下面例子中这么做:templatechildhook:mountedremoveLoadingtemplate
这样的写法可以用于处理加载第三方的初始化过程稍漫长的子组件时,我们可以加loading动画,等到子组件加载完毕,到了mounted生命周期时,把loading动画移除。
初次之外hook还有一个常用的写法,在一个需要轮询更新数据的组件上,我们通常在created里开启定时器,然后在beforeDestroy上清除定时器。而通过hook,开启和销毁定时器的逻辑我们都可以在created里实现:
像上面这种写法就保证了逻辑的统一,遵循了单一职责原则。
爱提问题的表妹作文600字我的妹妹今年7岁,叫洁洁,她是个非常有意思的小女孩,平时,她总爱提一些稀奇古怪的问题,比如:鸟儿为什么不能在水里游?鱼在水里为什么不会淹死?真叫人难以回答。去年放春假,我……
心肌炎患者调理好身体,首先要学会这6招心肌炎是一种心脏疾病,很多人对心肌炎不是很了解,如果有了心肌炎,却没有及时护理,很容易对身体健康造成巨大影响,严重的还会出现死亡的风险。心肌炎患者在治疗疾病的同时,也要掌握调理……
一年四季的校园小学六年级作文我们的校园真美丽!一个不知名的同学说道。是啊我们的学校真的很美丽。春天,校门口的柳树长出了嫩枝,我们的校园是最美丽的。教学楼前的那一块草坪,小草们刚发芽,有的已经绿得发黑……
解读北京稳经济45条事关平台经济的重点都在这,涉及居家生活直6月2日,《北京市统筹疫情防控和稳定经济增长的实施方案》(以下简称《实施方案》)正式发布,平台经济是45条措施的重头戏,小到网购外卖、直播带货,大到智慧城市、技术突破目前……
打字母哥308,打勇士266的霍福德,当年遇上詹姆斯打出什么很多人都说,随着时代的发展,NBA篮球比赛应该是越来越强的。但是,却有很多NBA前辈说:现役联盟的对抗和防守完全不如以前。例如,奥尼尔和戈贝尔此前公开在媒体上面进行口水大战,互……
弗格接丈母娘为娇妻庆生,林书豪加练,北京首钢无人接手弗格接丈母娘为娇妻庆生帮助辽宁男篮夺冠以后,弗格因为妻子怀孕马上就要生产,所以第一时间离开球队回到了美国。不过回国以后弗格在社交媒体上非常活跃,先是提前为未出生的女儿办满……
看!30大厂端午礼盒PK,真的太卷了转自公众号:创意广告每年端午节,除了翘首以待三天小假期的到来,少不了准备几个心爱的蛋黄肉粽浅炫一下,拉满过节的仪式感。当然,作为一枚爱吃瓜的广告人,单纯吃粽子总归有……
殊不知,脾胃虚寒也会上火?我最近老上火?用了很多寒凉药物,都不管用,该怎么办?关于上火,人们脑海里自然就会将其和热气联系在一起。殊不知,脾胃虚寒也会引起上火。《黄帝内经》里对于此问题就曾解释……
中年女人穿衣如何做到不费力的时髦?这3个小心机做到1样就很美到达某个年纪之后女人就会发现,穿衣搭配好像变得越来越难了。有的女人忽略年龄限制,依然穿着自己年轻时候的衣服,也有的女人对时尚一窍不通,看身边的朋友怎么穿就跟着怎么穿。这两……
超爱的补水保湿化妆水安利,巨补水滋润修复,让你远离危肌时节超爱的补水保湿化妆水安利,巨补水滋润修复,让你远离危肌时节!SKII嫩肤清莹露可能很多人都只知道SKII神仙水,但却忽略了它家的这瓶清莹露,作为一款二次清洁水,它添……
端午的大报恩寺,欢乐不打烊!昼夜都精彩!这个端午小长假大报恩寺遗址景区开启全天欢乐之旅白天,沉浸式龙舟探险游园会展现的是郑和下西洋的波澜壮阔晚间夜公园联动汽车后备箱文化艺术节秦淮河……
登山的学生作文300字导语:我站在山顶上极目远眺,一座座山峰都在我的脚下,景色非常壮观。我兴奋地挥动双手呼喊起来,山谷里发出回声,此起彼伏,越传越远。若不是身临其境,哪会有这种诗情画意的感觉啊!以下……