Vue异步组件处理路由组件加载状态的解决方案


Posted in Javascript onSeptember 07, 2018

vue.js 组件

组件(Component)是 Vue.js 最强大的功能之一。

组件可以扩展 HTML 元素,封装可重用的代码。

在大型单页面应用中,处于对性能的考虑和首屏加载速度的要求,我们一般都会使用webpack的代码分割和vue-router的路由懒加载功能将我们的代码分成一个个模块,并且只在需要的时候才从服务器加载一个模块。

但是这种解决方案也有其问题,当网络环境较差时,我们去首次访问某个路由模块,由于加载该模块的资源需要一定的时间,那么该段时间内,我们的应用就会处于无响应的状态,用户体验极差。

解决方案

这种情况,我们一方面可以缩小路由模块代码的体积,静态资源使用cdn存储等方式缩短加载时间,另一方面则可以路由组件上使用异步组件,显示loading和error等状态,使用户能够得到清晰明了的操作反馈。

Vue官方文档-动态组件&异步组件

具体实现

声明方法,基于Vue动态组件工厂函数来返回一个Promise对象

/**
 * 处理路由页面切换时,异步组件加载过渡的处理函数
 * @param {Object} AsyncView 需要加载的组件,如 import('@/components/home/Home.vue')
 * @return {Object} 返回一个promise对象
 */
function lazyLoadView (AsyncView) {
 const AsyncHandler = () => ({
  // 需要加载的组件 (应该是一个 `Promise` 对象)
  component: AsyncView,
  // 异步组件加载时使用的组件
  loading: require('@/components/public/RouteLoading.vue').default,
  // 加载失败时使用的组件
  error: require('@/components/public/RouteError.vue').default,
  // 展示加载时组件的延时时间。默认值是 200 (毫秒)
  delay: 200,
  // 如果提供了超时时间且组件加载也超时了,
  // 则使用加载失败时使用的组件。默认值是:`Infinity`
  timeout: 10000
 });
 return Promise.resolve({
  functional: true,
  render (h, { data, children }) {
   return h(AsyncHandler, data, children);
  }
 });
}

引入路由

const helloWorld = () => lazyLoadView(import('@/components/helloWorld'))
vue-router中使用
routes: [
  {
    path: '/helloWorld',
    name: 'helloWorld',
    component: helloWorld
  }
]

至此,改造已经完成,当你首次加载某一个组件的资源时(可以将网速调为 slow 3g,效果更明显),就会显示你在loading组件的内容,而当超出超时时间仍未加载完成该组件时,那么将显示error组件的内容(建议error组件尽量简单,因为当处于低速网络或者断网情况下时,error组件内的图片资源等有可能出现无法加载的问题)

总结

以上所述是小编给大家介绍的Vue异步组件处理路由组件加载状态的解决方案,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
轻轻松松学习JavaScript
Feb 25 Javascript
jquery ajax 登录验证实现代码
Sep 23 Javascript
aspx中利用js实现确认删除代码
Jul 22 Javascript
iframe的父子窗口之间的对象相互调用基本用法
Sep 03 Javascript
从零学JS之你需要了解的几本书
May 19 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 语法
Jan 09 Javascript
Angular4 中常用的指令入门总结
Jun 12 Javascript
Node.js+Express+MySql实现用户登录注册功能
Jul 10 Javascript
JS+canvas实现的五子棋游戏【人机大战版】
Jul 19 Javascript
JS实现按钮颜色切换效果
Sep 05 Javascript
微信小程序实现下拉刷新和轮播图效果
Nov 21 Javascript
解决vue 路由变化页面数据不刷新的问题
Mar 13 Javascript
Vue2.0 v-for filter列表过滤功能的实现
Sep 07 #Javascript
koa socket即时通讯的示例代码
Sep 07 #Javascript
vue侧边栏动态生成下级菜单的方法
Sep 07 #Javascript
Vuejs开发环境搭建及热更新【推荐】
Sep 07 #Javascript
小程序点赞收藏功能的实现代码示例
Sep 07 #Javascript
前端防止用户重复提交js实现代码示例
Sep 07 #Javascript
vue实现打印功能的两种方法
Sep 07 #Javascript
You might like
PHP5.0对象模型探索之抽象方法和抽象类
2006/09/05 PHP
php中将网址转换为超链接的函数
2011/09/02 PHP
使用PHP获取当前url路径的函数以及服务器变量
2013/06/29 PHP
PHP实现添加购物车功能
2017/03/06 PHP
javascript针对DOM的应用分析(四)
2012/04/15 Javascript
jquery load事件(callback/data)使用方法及注意事项
2013/02/06 Javascript
jQuery 遍历- 关于closest() 的方法介绍以及与parents()的方法区别分析
2013/04/26 Javascript
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
2013/04/26 Javascript
JS获取下拉列表所选中的TEXT和Value的实现代码
2014/01/11 Javascript
jQuery+HTML5实现图片上传前预览效果
2015/08/20 Javascript
JS设置CSS样式的方式汇总
2017/01/21 Javascript
vue生命周期实例小结
2018/08/15 Javascript
浅析微信扫码登录原理(小结)
2018/10/29 Javascript
详解在React-Native中持久化redux数据
2019/05/22 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
详解duck typing鸭子类型程序设计与Python的实现示例
2016/06/03 Python
深入理解Python3 内置函数大全
2017/11/23 Python
matplotlib作图添加表格实例代码
2018/01/23 Python
Python实现图片尺寸缩放脚本
2018/03/10 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
2019/06/28 Python
Python使用sklearn实现的各种回归算法示例
2019/07/04 Python
对tensorflow 中tile函数的使用详解
2020/02/07 Python
python开发前景如何
2020/06/11 Python
python 邮件检测工具mmpi的使用
2021/01/04 Python
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
军训生自我鉴定范文
2013/12/27 职场文书
大学学习个人的自我评价
2014/02/18 职场文书
社区优秀志愿者先进事迹
2014/05/09 职场文书
汉语言文学毕业求职信
2014/07/17 职场文书
医院护士工作检讨书
2014/10/26 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
2015年助残日活动总结
2015/03/27 职场文书
学生检讨书怎么写
2015/05/07 职场文书
董事会决议范本
2015/07/01 职场文书
晶体管单管来复再生式收音机
2021/04/22 无线电
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏