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 相关文章推荐
jquery+json实现的搜索加分页效果
Mar 31 Javascript
javascript中用星号表示预录入内容的实现代码
Jan 08 Javascript
js自定义事件代码说明
Jan 31 Javascript
高效的获取当前元素是父元素的第几个子元素
Oct 15 Javascript
jQuery实现checkbox全选的方法
Jun 10 Javascript
JavaScript正则表达式中的ignoreCase属性使用详解
Jun 16 Javascript
jquery ajax局部加载方法详解(实现代码)
May 12 Javascript
js中使用使用原型(prototype)定义方法的好处详解
Jul 04 Javascript
js判断是否为空和typeof的用法(详解)
Oct 07 Javascript
详解使用angular的HttpClient搭配rxjs
Sep 01 Javascript
layer.confirm点击第一个按钮关闭弹出框的方法
Sep 09 Javascript
详解webpack的文件监听实现(热更新)
Sep 11 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
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
2007/02/22 PHP
Codeigniter发送邮件的方法
2015/03/19 PHP
DWZ+ThinkPHP开发时遇到的问题分析
2016/12/12 PHP
php写入文件不覆盖的实例讲解
2019/09/17 PHP
js导出格式化的excel 实例方法
2013/07/17 Javascript
Js 去掉字符串中的空格(实现代码)
2013/11/19 Javascript
JavaScript避免代码的重复执行经验技巧分享
2014/04/17 Javascript
js全选实现和判断是否有复选框选中的方法
2015/02/17 Javascript
jQuery检测鼠标左键和右键点击的方法
2015/03/17 Javascript
JavaScript通过字典进行字符串翻译转换的方法
2015/03/19 Javascript
JavaScript使用slice函数获取数组部分元素的方法
2015/04/06 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
2015/12/08 Javascript
jQuery Mobile动态刷新页面样式的实现方法
2016/05/28 Javascript
jQuery中delegate()方法的用法详解
2016/10/13 Javascript
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
2016/12/30 NodeJs
在页面中引入js的两种方法(推荐)
2017/08/29 Javascript
JS实现全屏预览F11功能的示例代码
2018/07/23 Javascript
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
2018/09/28 Javascript
微信小程序开发实现的IP地址查询功能示例
2019/03/28 Javascript
jQuery开发仿QQ版音乐播放器
2020/07/10 jQuery
vue自定义树状结构图的实现方法
2020/10/18 Javascript
Python+Opencv识别两张相似图片
2020/03/23 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
2017/02/16 Python
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧
2018/01/04 Python
python 文件转成16进制数组的实例
2018/07/09 Python
PyQt5重写QComboBox的鼠标点击事件方法
2019/06/25 Python
Python中and和or如何使用
2020/05/28 Python
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
班干部演讲稿
2014/04/24 职场文书
质量保证书范本
2014/04/29 职场文书
美德少年事迹材料500字
2014/08/19 职场文书
金融保险专业求职信
2014/09/03 职场文书
Python3 使用pip安装git并获取Yahoo金融数据的操作
2021/04/08 Python
Redis字典实现、Hash键冲突及渐进式rehash详解
2021/09/04 Redis
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android