当前位置: 首页>編程日記>正文

Vue进阶-异步动态加载组件

Vue进阶-异步动态加载组件

文章目录

  • 前言
  • 一、为什么会出现这种情况?
  • 二、常用解决办法
    • 1.使用v-if来判断是否有数据来展示dom结构(一般般)
    • 2.通过$set来触发Vue的数据重新渲染机制(鸡肋)
    • 3.通过监听子组件数据源来实现子组件数据动态改变(基本完美)
  • 前后变化
  • 总结
    • 明天,又是充满希望的一天!


前言

此篇文章缘起于在业务开发中需要使用父子组件嵌套,子组件的数据源来自于父级的一个接口请求,
虽然这个我们的后端同学接口有redis缓存,但是身为一个前端码农,本着挖掘的思想,开始了父子组件之间能如何优化,
避免由于数据延迟导致子组件数据为空的情况(虽然v-if判断DOM结构能实现,但是页面上会有0.5s左右的结构变化,显然不是解决问题的最终办法)


一、为什么会出现这种情况?

让我们先来看一下vue中 父子组件各种生命周期的执行顺序:
1.渲染顺序

父beforeCreate=>父created=>父beforeMount=>父beforeCreate=>子created=>子beforeMount=>子mounted=>父mounted

2.子组件更新过程

父beforeUpdate=>子beforeUpdate=>子update=>父updated

3.父组件更新过程

父beforeUpdate=>父updated

4.销毁过程

父beforeDestroy=>子beforeDestroy=>子destroyed=>父destoryed

可以看出渲染时是父组件在创建之前稍微等待了一下,然后去渲染子组件,而我们如果在父组件mounted或者created里面去请求一个接口同时传值到子组件上,若接口返回数据时间过长,很容易出现子组件数据还没到就已经渲染完成的情况。总结出来部分解决办法,同时温故知新了一下Vue的动态异步组件相关知识,如下:

二、常用解决办法

1.使用v-if来判断是否有数据来展示dom结构(一般般)

这个可以说是很经典的一个办法,但是会有展示上的问题,即dom结构会先消失而后重新渲染
并不算是一个完美的解决方案,所以暂时Pass掉

2.通过$set来触发Vue的数据重新渲染机制(鸡肋)

鸡肋,大多数情况下要配合监听来使用,那么问题来了,我为什么不直接使用监听呢?

3.通过监听子组件数据源来实现子组件数据动态改变(基本完美)

watch: {filterList: { //父组件传过来的数据源deep: true,immediate: true,handler(newValue) {if (newValue) {this.$set(this, 'filterListCopy', newValue); //触发vue的重新渲染机制}},},},

值得一说的是监听属性的immediate是否在这个监听属性挂载成功之后先执行以下handler里面的方法,以及deep为深层嵌套的对象或数组的监听,都是必须要加的
这个时候我脑海又衍生了一个新的问题:能否在组件导入配置的时候进行优化?
答案是肯定可以的,先让我们来看看Vue对异步组件挂载相关的说明:

在这里插入图片描述
显而易见的两个作用:
1.大大节省了JS包的大小,可以视为一个项目优化点,能看见这个组件的时候才会进行加载肯定是极美的
2.组件里面的数据会被进行缓存,下次时候可以重新进行渲染,自带自动缓存系统

它甚至支持返回promise和工厂模式在main.js进行全局封装:
在这里插入图片描述
我们在实际开发中可以如何优化组件引入相关的逻辑呢?
很简单,看一下你的项目 如果目前组件是这种导入方式 import xxx from xxx
在这里插入图片描述
可以通过改为:

// 组件改为异步按需加载,不再走父子组件的生命周期,优化响应速度
Vue.component('??', () => import('@/??/??.vue'));

来实现动态加载以及异步加载,这个时候相应的组件会跳出父子组件的生命周期

前后变化

如图所示
在这里插入图片描述
页面默认会把所有的js文件(除导入的库),打包成一个整体的js文件,进入指定页面后进行一次性编译

配置完动态组件之后:
在这里插入图片描述
显而易见 这些组件会被从app.js的文件里面抽离出来,在页面需要的时候跟app.js文件一起进行加载
类似于小程序分包的一个效果,是一个很不错的优化点,在业务越来越多,需求越来越多的PC端,我们需要高复用性,低耦合性组件的同时是否可以考虑使用动态组件来优化一下组件加载速度呢?

总结

好记性不如烂笔头
随时随地给自己对项目的状态进行实时的记录,想来以后回忆起来也是极美的

明天,又是充满希望的一天!

最后放上一张镇楼图
在这里插入图片描述


https://www.fengoutiyan.com/post/14530.html

相关文章:

  • angular动态加载组件
  • 应用组件加载中
  • js异步加载方式有哪些
  • vue异步数据给子组件
  • vue异步组件加载实现方式
  • 加载组件异常
  • vue 动态加载组件
  • vue按需加载组件
  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機