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实现div阴影效果示例代码
Sep 16 Javascript
js实现可兼容IE、FF、Chrome、Opera及Safari的音乐播放器
Feb 11 Javascript
学习使用bootstrap3栅格系统
Apr 12 Javascript
喜大普奔!jQuery发布 3.0 最终版
Jun 12 Javascript
纯js实现html转pdf的简单实例(推荐)
Feb 16 Javascript
Angular.js中定时器循环的3种方法总结
Apr 27 Javascript
Angularjs验证用户输入的字符串是否为日期时间
Jun 01 Javascript
js脚本编写简单刷票投票系统
Jun 27 Javascript
通过fastclick源码分析彻底解决tap“点透”
Dec 24 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
Jan 07 Javascript
浅入深出Vue之组件使用
Jul 11 Javascript
详解element上传组件before-remove钩子问题解决
Apr 08 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
Terran建筑一览
2020/03/14 星际争霸
如何在WIN2K下安装PHP4.04
2006/10/09 PHP
解析CI的AJAX分页 另类实现方法
2013/06/27 PHP
symfony2.4的twig中date用法分析
2016/03/18 PHP
如何使用php等比例缩放图片
2016/10/12 PHP
fromCharCode和charCodeAt 方法
2006/12/27 Javascript
Mootools 1.2教程(2) DOM选择器
2009/09/14 Javascript
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
jquery向上向下取整适合分页查询
2014/09/06 Javascript
原生javascript实现Tab选项卡切换功能
2015/01/12 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
JS实现从表格中动态删除指定行的方法
2015/03/31 Javascript
60行js代码实现俄罗斯方块
2015/03/31 Javascript
js实现简单选项卡与自动切换效果的方法
2015/04/10 Javascript
jQuery超精致图片轮播幻灯片特效代码分享
2015/09/10 Javascript
javascript:void(0)是什么意思及href=#与href=javascriptvoid(0)的区别
2015/11/13 Javascript
template.js前端模板引擎使用详解
2017/10/10 Javascript
nodejs发送http请求时遇到404长时间未响应的解决方法
2017/12/10 NodeJs
JS抛物线动画实例制作
2018/02/24 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
2018/09/05 Javascript
Vue中rem与postcss-pxtorem的应用详解
2019/11/20 Javascript
JS typeof fn === 'function' && fn()详解
2020/08/22 Javascript
OpenLayers实现图层切换控件
2020/09/25 Javascript
[05:24]TI9采访——教练
2019/08/24 DOTA
python八皇后问题的解决方法
2018/09/27 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
2019/12/04 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
2020/01/28 Python
python定义类的简单用法
2020/07/24 Python
Unineed旗下时尚轻奢网站:FABHunt
2019/05/13 全球购物
什么是SQL Server的确定性函数和不确定性函数
2016/08/04 面试题
教师党员承诺书
2014/03/25 职场文书
营销部内勤岗位职责
2014/04/30 职场文书
销售内勤岗位职责范本
2015/04/13 职场文书
女性健康知识讲座主持词
2015/07/04 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python