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 验证浏览器是否支持javascript的方法小结
May 17 Javascript
JS获取dom 对象 ajax操作 读写cookie函数
Nov 18 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
Sep 11 Javascript
推荐一个封装好的getElementsByClassName方法
Dec 02 Javascript
jQuery实现的漂亮表单效果代码
Aug 18 Javascript
详解JavaScript基本类型和引用类型
Dec 09 Javascript
JS中call/apply、arguments、undefined/null方法详解
Feb 15 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
May 24 Javascript
JavaScript中this的用法实例分析
Dec 19 Javascript
vuejs 单文件组件.vue 文件的使用
Jul 28 Javascript
node.js多个异步过程中判断执行是否完成的解决方案
Dec 10 Javascript
jQuery实现带进度条的轮播图
Sep 13 jQuery
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
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
2010/04/02 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
PHP实现RTX发送消息提醒的实例代码
2017/01/03 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
php定期拉取数据对比方法实例
2019/09/22 PHP
菜单效果
2006/10/14 Javascript
JQuery 常用方法基础教程
2009/02/06 Javascript
url 特殊字符 传递参数解决方法
2010/01/01 Javascript
基于jquery的textarea发布框限制文字字数输入(添加中文识别)
2012/02/16 Javascript
JS 添加千分位与去掉千分位的示例
2013/07/11 Javascript
限制textbox或textarea输入字符长度的JS代码
2013/10/16 Javascript
jQuery实现冻结表头的方法
2015/03/09 Javascript
Js与Jq 获取页面元素值的方法和差异对比
2015/04/30 Javascript
VUEJS实战之利用laypage插件实现分页(3)
2016/06/13 Javascript
JS选取DOM元素的简单方法
2016/07/08 Javascript
微信小程序实现图片自适应(支持多图)
2017/01/25 Javascript
vue源码解析之事件机制原理
2018/04/21 Javascript
Vue绑定内联样式问题
2018/10/17 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
基于vue hash模式微信分享#号的解决
2020/09/07 Javascript
[02:30]辉夜杯主赛事第二日胜者组半决赛 CDEC.Y赛后采访
2015/12/26 DOTA
Python设计实现的计算器功能完整实例
2017/08/18 Python
flask框架使用orm连接数据库的方法示例
2018/07/16 Python
Python 中的lambda函数介绍
2018/10/10 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
Python virtualenv虚拟环境实现过程解析
2020/04/18 Python
pandas dataframe 中的explode函数用法详解
2020/05/18 Python
python-图片流传输的思路及示例(url转换二维码)
2020/12/21 Python
Django中如何用xlwt生成表格的方法步骤
2021/01/31 Python
Mamaearth官方网站:印度母婴护理产品公司
2019/10/06 全球购物
Madda Fella官网:美国冒险家服装品牌
2020/01/16 全球购物
乌克兰巴士票购买网站:inBus
2021/03/12 全球购物
C#的几个面试问题
2016/05/22 面试题
竞选学生会主席演讲稿
2014/04/24 职场文书
nginx配置限速限流基于内置模块
2022/05/02 Servers
解决 redis 无法远程连接
2022/05/15 Redis