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 相关文章推荐
JS的反射问题
Apr 07 Javascript
网页加载时页面显示进度条加载完成之后显示网页内容
Dec 23 Javascript
Jquery实现仿腾讯娱乐频道焦点图(幻灯片)特效
Mar 06 Javascript
jQuery中 delegate使用的问题
Jul 03 Javascript
js实现简洁的TAB滑动门效果代码
Sep 06 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
Sep 14 Javascript
js和jQuery设置Opacity半透明 兼容IE6
May 24 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
Nov 30 Javascript
JS实现字符串转驼峰格式的方法
Dec 16 Javascript
node操作mysql数据库实例详解
Mar 17 Javascript
jquery dataTable 后台加载数据并分页实例代码
Jun 07 jQuery
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
Nov 29 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
《星际争霸重制版》兵种对比图鉴
2020/03/02 星际争霸
php pcntl_fork和pcntl_fork 的用法
2009/04/13 PHP
探讨PHP使用eAccelerator的API开发详解
2013/06/09 PHP
示例详解Laravel重置密码代码重构
2016/08/10 PHP
IE和FireFox(FF)中js和css的不同
2009/04/13 Javascript
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
2010/04/20 Javascript
Safari5中alert的无限循环BUG
2011/04/07 Javascript
js模拟滚动条(横向竖向)
2013/02/22 Javascript
JS Replace()的高级使用方法介绍
2013/06/29 Javascript
jquery处理json数据实例分析
2014/06/03 Javascript
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
2016/08/05 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
react native带索引的城市列表组件的实例代码
2017/08/08 Javascript
JavaScript使用Ajax上传文件的示例代码
2017/08/10 Javascript
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
jQuery实现的简单日历组件定义与用法示例
2018/12/24 jQuery
layui数据表格重载实现往后台传参
2019/11/15 Javascript
Vue如何循环提取对象数组中的值
2020/11/18 Vue.js
详解Vue3 Teleport 的实践及原理
2020/12/02 Vue.js
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
Python的pycurl包用法简介
2015/11/13 Python
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
python基于FTP实现文件传输相关功能代码实例
2019/09/28 Python
python 实现字符串下标的输出功能
2020/02/13 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
阿里健康官方海外旗舰店:阿里健康国际自营
2017/11/24 全球购物
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
德国最大的婴儿用品网上商店:Kidsroom.de(支持中文)
2020/09/02 全球购物
中学生学雷锋活动心得体会
2014/03/10 职场文书
报关员个人职业生涯规划书
2014/03/12 职场文书
学习全国两会精神心得体会范文
2014/03/17 职场文书
药剂专业个人求职信范文
2014/04/29 职场文书
分公司经理任命书
2014/06/05 职场文书
质检员岗位职责范本
2015/04/07 职场文书
入党积极分子群众意见
2015/06/01 职场文书
卖车协议书范文
2016/03/23 职场文书