游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

我在项目中用实际用到的22个Vue优化技巧

  代码绝不止能跑就行,但是废话只说一句:码字不易求个,。一、代码优化
  vfor中使用key
  使用vfor更新已渲染的元素列表时,默认用就地复用策略;列表数据修改的时候,他会根据key值去判断某个值是否修改,如果修改,则重新渲染这一项,否则复用之前的元素;
  使用key的注意事项:不要使用可能重复的或者可能变化key值(控制台也会给出提醒)不要使用数组的index作为key值,因为如果在数组中插入一个元素时,其后面的元素index将会变化。如果数组中没有唯一的key值可用,可以考虑对其添加一个key字段,值为Symbol()即可保证唯一。
  vifvelseifvelse中使用key
  可能很多人都会忽略这个点
  原因:默认情况下,Vue会尽可能高效的更新DOM。这意味着其在相同类型的元素之间切换时,会修补已存在的元素,而不是将旧的元素移除然后在同一位置添加一个新元素。如果本不相同的元素被识别为相同,则会出现意料之外的副作用。
  如果只有一个vif,没有velse或者vifelse的话,就没有必要加key了
  相对于vfor的key,vifvelseifvelse中的key相对简单,我们可以直接写入固定的字符串或者数组即可transitionbuttonvifisEditingvon:clickisEditingfalseSavebuttonbuttonvelsevon:clickisEditingtrueEditbuttontransition复制代码。venteractive,。vleaveactive{transition:all1s;}。venter,。vleaveto{opacity:0;transform:translateY(30px);}。vleaveactive{position:absolute;}复制代码
  例如对于上面的代码,你会发现虽然对button添加了过渡效果,但是如果不添加key切换时是无法触发过渡的
  vfor和vif不要一起使用(Vue2)
  此优化技巧仅限于Vue2,Vue3中对vfor和vif的优先级做了调整
  这个大家都知道
  永远不要把vif和vfor同时用在同一个元素上。引至Vue2。x风格指南
  原因是vfor的优先级高于vif,所以当它们使用再同一个标签上是,每一个渲染都会先循环再进行条件判断
  注意:Vue3中vif优先级高于vfor,所以当vfor和vif一起使用时效果类似于Vue2中把vif上提的效果
  例如下面这段代码在Vue2中是不被推荐的,Vue也会给出对应的警告ullivforuserinusersvifuser。active{{user。name}}liul复制代码
  我们应该尽量将vif移动到上级或者使用计算属性来处理数据ulvifactivelivforuserinusers{{user。name}}liul复制代码
  如果你不想让循环的内容多出一个无需有的上级容器,那么你可以选择使用template来作为其父元素,template不会被浏览器渲染为DOM节点
  如果我想要判断遍历对象里面每一项的内容来选择渲染的数据的话,可以使用computed来对遍历对象进行过滤jsletusersActivecomputed(()users。filter(useruser。active))templateullivforuserinusersActive{{user。name}}liul复制代码
  合理的选择vif和vshow
  vif和vshow的区别相比大家都非常熟悉了;vif通过直接操作DOM的删除和添加来控制元素的显示和隐藏;vshow是通过控制DOM的displayCSS熟悉来控制元素的显示和隐藏
  由于对DOM的添加删除操作性能远远低于操作DOM的CSS属性
  所以当元素需要频繁的显示隐藏变化时,我们使用vshow来提高性能。
  当元素不需要频繁的显示隐藏变化时,我们通过vif来移除DOM可以节约掉浏览器渲染这个的一部分DOM需要的资源
  使用简单的计算属性应该把复杂计算属性分割为尽可能多的更简单的property。
  易于测试当每个计算属性都包含一个非常简单且很少依赖的表达式时,撰写测试以确保其正确工作就会更加容易。易于阅读简化计算属性要求你为每一个值都起一个描述性的名称,即便它不可复用。这使得其他开发者(以及未来的你)更容易专注在他们关心的代码上并搞清楚发生了什么。更好的拥抱变化任何能够命名的值都可能用在视图上。举个例子,我们可能打算展示一个信息,告诉用户他们存了多少钱;也可能打算计算税费,但是可能会分开展现,而不是作为总价的一部分。小的、专注的计算属性减少了信息使用时的假设性限制,所以需求变更时也用不着那么多重构了。
  引至Vue2风格指南
  computed大家后很熟悉,它会在其表达式中依赖的响应式数据发送变化时重新计算。如果我们在一个计算属性中书写了比较复杂的表达式,那么其依赖的响应式数据也任意变得更多。当其中任何一个依赖项变化时整个表达式都需要重新计算letpricecomputed((){letbasePricemanufactureCost(1profitMargin)return(basePricebasePrice(discountPercent0))})复制代码
  当manufactureCost、profitMargin、discountPercent中任何一个变化时都会重新计算整个price。
  但是如果我们改成下面这样letbasePricecomputed(()manufactureCost(1profitMargin))letdiscountcomputed(()basePrice(discountPercent0))letfinalPricecomputed(()basePricediscount)复制代码
  如果当discountPercent变化时,只会重新计算discount和finalPrice,由于computed的缓存特性,不会重新计算basePrice
  functional函数式组件(Vue2)
  注意,这仅仅在Vue2中被作为一种优化手段,在3。x中,有状态组件和函数式组件之间的性能差异已经大大减少,并且在大多数用例中是微不足道的。因此,在SFCs上使用functional的开发人员的迁移路径是删除该attribute,并将props的所有引用重命名为props,将attrs重命名为attrs。
  优化前templatesectionvelseclassoffsectiontemplate复制代码
  优化后templatefunctionalsectionvelseclassoffsectiontemplate复制代码没有this(没有实例)没有响应式数据
  拆分组件
  什么?你写的一个vue文件有一千多行代码?
  合理的拆分组件不仅仅可以优化性能,还能够让代码更清晰可读。单一功能原则嘛
  源自slides。comakryumvuec
  优化前template{{heavy()}}template复制代码
  优化后templateChildComptemplate复制代码
  由于Vue的更新是组件粒度的,虽然每一帧都通过数据修改导致了父组件的重新渲染,但是ChildComp却不会重新渲染,因为它的内部也没有任何响应式数据的变化。所以优化后的组件不会在每次渲染都执行耗时任务
  使用局部变量
  优化前template{{result}}template复制代码
  优化后template{{result}}template复制代码这里主要是优化前后的组件的计算属性result的实现差异,优化前的组件多次在计算过程中访问this。base,而优化后的组件会在计算前先用局部变量base,缓存this。base,后面直接访问base。
  那么为啥这个差异会造成性能上的差异呢,原因是你每次访问this。base的时候,由于this。base是一个响应式对象,所以会触发它的getter,进而会执行依赖收集相关逻辑代码。类似的逻辑执行多了,像示例这样,几百次循环更新几百个组件,每个组件触发computed重新计算,然后又多次执行依赖收集相关逻辑,性能自然就下降了。
  从需求上来说,this。base执行一次依赖收集就够了,把它的getter求值结果返回给局部变量base,后续再次访问base的时候就不会触发getter,也不会走依赖收集的逻辑了,性能自然就得到了提升。
  引至揭秘Vue。js九个性能优化技巧
  使用KeepAlive
  在一些渲染成本比较高的组件需要被经常切换时,可以使用keepalive来缓存这个组件
  而在使用keepalive后,被keepalive包裹的组件在经过第一次渲染后,的vnode以及DOM都会被缓存起来,然后再下一次再次渲染该组件的时候,直接从缓存中拿到对应的vnode和DOM,然后渲染,并不需要再走一次组件初始化,render和patch等一系列流程,减少了script的执行时间,性能更好。
  注意:滥用keepalive只会让你的应用变得更加卡顿,因为他会长期占用较大的内存
  事件的销毁
  当一个组件被销毁时,我们应该清除组件中添加的全局事件和定时器等来防止内存泄漏
  Vue3的HOOK可以让我们将事件的声明和销毁写在一起,更加可读functionscrollFun(){。。。}document。addEventListener(scroll,scrollFun)onBeforeUnmount((){document。removeEventListener(scroll,scrollFun)})复制代码
  Vue2依然可以通过once来做到这样的效果,当然你也可以在optionsAPIbeforeDestroy中销毁事件,但是我更加推荐前者的写法,因为后者会让相同功能的代码更分散functionscrollFun(){。。。}document。addEventListener(scroll,scrollFun)this。once(hook:beforeDestroy,(){document。addEventListener(scroll,scrollFun)})复制代码functionscrollFun(){。。。}exportdefault{created(){document。addEventListener(scroll,scrollFun)},beforeDestroy(){document。addEventListener(scroll,scrollFun)}}复制代码
  图片加载
  图片懒加载:适用于页面上有较多图片且并不是所有图片都在一屏中展示的清空,vuelazyload插件给我们提供了一个很方便的懒加载指令vlazy
  但是并不是所有图片都适合使用懒加载,例如banner、相册等更加推荐使用图片预加载技术,将当前展示图片的前一张和后一张优先下载。
  采用合理的数据处理算法
  这个相对比较考验数据结构和算法的功底
  例如一个将数组转化为多级结构的方法数组转树形结构,时间复杂度O(n)paramlist数组paramidKey元素id键paramparIdKey元素父id键paramparId第一级根节点的父id值return{〔〕}functionlistToTree(list,idKey,parIdKey,parId){letmap{};letresult〔〕;letlenlist。length;构建mapfor(leti0;ilen;i){将数组中数据转为键值对结构(这里的数组和obj会相互引用,这是算法实现的重点)map〔list〔i〕〔idKey〕〕list〔i〕;}构建树形数组for(leti0;ilen;i){letitemParIdlist〔i〕〔parIdKey〕;顶级节点if(itemParIdparId){result。push(list〔i〕);continue;}孤儿节点,舍弃(不存在其父节点)if(!map〔itemParId〕){continue;}将当前节点插入到父节点的children中(由于是引用数据类型,obj中对于节点变化,result中对应节点会跟着变化)if(map〔itemParId〕。children){map〔itemParId〕。children。push(list〔i〕);}else{map〔itemParId〕。children〔list〔i〕〕;}}returnresult;}复制代码
  其他
  除了上面说的方法以外还有很多优化技巧,只是我在项目并不是太常用冻结对象(避免不需要响应式的数据变成响应式)长列表渲染分批渲染长列表渲染动态渲染(vuevirtualscroller)。。。二、首屏体积优化
  我在项目中关于首屏优化主要有以下几个优化方向体积代码分割网络
  体积优化压缩打包代码:webpack和vite的生产环境打包默认就会压缩你的代码,这个一般不需要特殊处理,webpack也可以通过对应的压缩插件手动实现取消sourcemap:可以查看你的打包产物中是否有。map文件,如果有你可以将sourcemap的值设置为false或者空来关闭代码映射(这个占用的体积是真的大)打包启用gizp压缩:这个需要服务器也开启允许gizp传输,不然启用了也没啥用(webpack有对应的gzip压缩插件,不太版本的webpack压缩插件可能不同,建议先到官网查询)
  代码分割
  代码分割的作用的将打包产物分割为一个一个的小产物,其依赖esModule。所以当你使用import()函数来导入一个文件或者依赖,那么这个文件或者依赖就会被单独打包为一个小产物。路由懒加载和异步组件都是使用这个原理。路由懒加载异步组件
  对于UI库我一般不会使用按需加载组件,而是比较喜欢CDN引入的方式来优化。三、网络
  CDN:首先就是上面的说的CDN引入把,开发阶段使用本地库,通过配置外部扩展(Externals)打包时来排除这些依赖。然后在html文件中通过CDN的方式来引入它们
  ServerPush:HTTP2已经相对成熟了;经过上面的CDN引入,我们可以对网站使用HTTP2的ServerPush功能来让浏览器提前加载这些CDN和其他文件。
  开启gzip:这个上面已经说过了,其原理就是当客户端和服务端都支持gzip传输时,服务端会优先发送经过gzip压缩过的文件,然后客户端接收到在进行解压。
  开启缓存:一般我使用的是协商缓存,但是这并不适用于所有情况,例如对于使用了ServerPush的文件,就不能随意的修改其文件名。所以我一般还会将生产的主要文件固定文件名
  作者:月夕
  链接:https:juejin。cnpost7005880217684148231

索尼发布新款OLED电视索尼将在2022年推出4款全新的OLED电视,分别为A80KA85KA90KA95K系列,这一消息也得到很多专业人士的认可,相比之前每年在OLED领域的两个系列,2022年索尼……政策暖风频吹新能源汽车换电赛道升温〔新闻页台海网〕原标题:政策暖风频吹新能源汽车换电赛道升温新能源汽车换电赛道迎来政策利好。1月21日发布的《促进绿色消费实施方案》提出,大力推广新能源汽车,推动开展……龙湖总部更名为赋能平台在宣布成立地产航道外,龙湖还对集团总部进行轻量化设置,更名为集团赋能平台,设立战略研究部、供应链管理部、公共事务部、品牌部、数字科技部、人力资源及行政部、财务部、法律事务部等职……耍猴鼻祖最懂中国人和印度人占便宜的心理又来了,年轻人第一台车选择多的很,为啥选你的第一台车!恶心的广告词,又他么的来饥饿营销,一开个发布会就卖完了!绝对不能把生命压在这种没有企业良心的企业!小米比联想更可恶!缭乱整……龙王回归小米MIX4详细测评MIX,一台个伴随着争议和热爱成长的系列,从MIX1开始他就伴随着极高的关注度,喜欢的人认为MIX外观设计极致,像一台艺术品,而不喜欢的人认为他太过超前,不够实用。但是必须承认……实体店只要转变经营方式和赚钱方式,同样可以打败互联网电商现在的实体店老板都说生意不好做,骂马云骂互联网电商,其实不是互联网电商打败了实体店,而是时代在淘汰不愿意改变的人和落后的商业模式。实体店作为生产和消费的链接点,在数字化的今天,……大家觉得华为手机能把苹果手机排挤出中国市场吗?想多了,我刚刚把华为换回苹果了,就不是一个档次的东西,爱国这种东西忽悠一次可以,老拿这种来作为高价的外衣就不合适了,以后坚决不用,除非价格减半差不多!不可能,现在华为手机……iPhone13发售时间曝光高通和中兴完成5G毫米波测试01hriPhone13发售时间、渲染图曝光近日,追踪苹果的知名消息人士琼普罗瑟(JonProsser)透露,iPhone13系列将于9月14日发布,并将于9月24日在全……曾泛滥的共享单车,为何如今只剩下三种颜色?在之前的一段时间内,毫无疑问ofo、摩拜、小蓝等共享单车都是非常耀眼的,大街小巷都遍布着黄、橙、蓝甚至更多不同的颜色,好不热闹。但这样的盛况却没有保持太久,小蓝因不可抗力……微信8。0。11双版本更新朋友圈能换动态封面了,还支持多账号分享最实在的玩机技巧,洞察最前沿的科技资讯!大家好,这里是手机科技园!最近这几天,微信更新的频率有点高。先是iOS端更新到8。0。10,然后安卓端紧跟其后,接着安卓微信又……AI这时代,星辰大海,百度世界大会2021拥抱未来8月18日,以AI这时代,星辰大海为主题的2021百度世界大会在百度App、央视新闻客户端等平台同步直播。本次大会由总台央视主持人撒贝宁担任主持,在3个小时的直播中生动展示百度……吐槽中国联通不能忍的服务,这个真得改改了随着互联网技术高速发展,给人们生活带来诸多便利。但作为电信网络服务商,依旧存在不能忍的服务,像下面这个服务真得改改了。有市民反应,当自己联通手机卡长期没有使用,且导致欠费……
香蜜沉沉烬如霜圆满收官鎏英公主终成一代魔尊星关系9月5日讯由杨紫、邓伦、陈钰琪主演的古装电视剧《香蜜沉沉烬如霜》已于昨晚迎来大结局。该剧作为2018年首部上星的黄金档古装剧,自开播以来关注度一路飙升,话题讨论量持续不断……香蜜沉沉烬如霜大结局锦觅重生与旭凤归隐人间生活《香蜜沉沉烬如霜》大结局,锦觅化作旭凤眼中的一滴泪死去之后,旭凤苦苦找寻能救活她的方法,整日沉浸在与锦觅的过往不能自已,润玉也会时常陪锦觅喝酒解闷。一日,旭凤正看着锦觅留下的旧……李沁爱上特种兵高燃开播走心诠释军医信仰引期待由天毅执导,黄景瑜、李沁等主演的现代军旅剧《爱上特种兵》将于今日开播,该剧改编自热门IP《军装下的绕指柔》,讲述了温柔独立、敢爱敢恨的军医夏初在经历了诸多困难阻挠之后仍能坚守医……新能源不可忽视的机会传统汽车大多数用的都是化石燃料,目前市面上主流的新能源汽车动力电池种类大致归为铅酸电池、镍氢电池、钴酸锂离子电池、锰酸锂离子电池、磷酸铁锂离子电池和三元锂离子电池(镍钴锰酸锂离……大侠霍元甲今晚央八首播赵文卓领衔新武林风云起星关系7月28日讯由中央电视台、爱奇艺出品,完美建信、完美世界影视联合出品,李莅樱任总制片人,郭靖宇任总编剧,柏杉任总导演、刘方任导演,赵文卓领衔主演,毛林林、释小龙、王之一、……猎狼者今日收官秦昊尹昉出奇制胜捉狼子归案芒果季风剧场推出的国内首部反盗猎短剧《猎狼者》正在湖南卫视、芒果TV热播中。魏疆(秦昊饰)与秦川(尹昉饰)兵分两路前往屋松山,寻找幕后黑手头狼毒鹞子(尹铸胜饰),猎狼行动最终战……猎狼者正在热播秦昊尹昉正式向狼子宣战芒果季风剧场推出的国内首部反盗猎短剧《猎狼者》正在湖南卫视、芒果TV热播中。魏疆(秦昊饰)与秦川(尹昉饰)兵分两路前往屋松山,寻找幕后黑手头狼毒鹞子,猎狼行动最终战即将打响。……微信支付宝个人收款码不得用于经营性收款?谣言极目新闻记者周丹2月16日,微博话题微信支付宝回应追查个人收款码近4年数据冲上热搜。咋回事呢?原来,又有网传消息称,自2022年3月1日起,微信、支付宝的个人收款码……猎狼者热播秦昊尹昉并肩作战勇击悍匪芒果季风剧场国内首部反盗猎短剧《猎狼者》正在湖南卫视、芒果TV同步热播,该剧由芒果TV、湖南卫视、芒果超媒出品,同旭文化承制,曹盾、高翔执导,秦昊、尹昉、黄子星领衔主演,沈佳妮……时光与你别来无恙收官陈宥维成长路上不断突破由陈宥维和徐艺洋领衔主演的爱奇艺治愈系甜剧《时光与你别来无恙》即将收官。剧中,陈宥维饰演的是天才物理少年姜颠,徐艺洋饰演的是舞蹈演员程逢,一次意外姜颠看到了程逢一个人跳舞,因此……继承者计划王彦霖含泪枪击杨皓宇多势力现形开启终极厮杀金牌卧底题材悬疑喜剧《继承者计划》由刘闯执导,王彦霖、李欣燃、郑家彬、杨皓宇领衔主演,张国柱特别出演。在搜狐视频上线后引发网友的一片热议,该片讲述了由王彦霖饰演的东北混混李金水……英特尔拟60亿美元收购高塔半导体,加强芯片代工能力据华尔街日报2月15日消息,英特尔欲以近60亿美元价格收购高塔半导体。2月15日晚间,英特尔确认,根据协议将以每股53美元的现金收购Tower半导体。相关人士指出,英特尔此次收……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网