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 Scoping and Hoisting 翻译
Jul 03 Javascript
浅析JavaScript中的typeof运算符
Nov 30 Javascript
jQuery不使用插件及swf实现无刷新文件上传
Dec 08 Javascript
12个超实用的JQuery代码片段
Nov 02 Javascript
JS加载器如何动态加载外部js文件
May 26 Javascript
Node.js批量给图片加水印的方法
Nov 15 Javascript
微信小程序删除处理详解
Aug 16 Javascript
通过函数作用域和块级作用域看javascript的作用域链
Aug 05 Javascript
jQuery实现上下滚动公告栏详细代码
Nov 21 jQuery
js中Array对象的常用遍历方法详解
Jan 17 Javascript
基于JS实现一个随机生成验证码功能
May 29 Javascript
Typescript 中的 interface 和 type 到底有什么区别详解
Jun 18 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
PHP JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
php 使用array函数实现分页
2015/02/13 PHP
PHP实现的方程求解示例分析
2016/11/11 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
2017/06/13 PHP
PHP迭代器和迭代的实现与使用方法分析
2018/04/19 PHP
Laravel 修改默认日志文件名称和位置的例子
2019/10/17 PHP
js计数器代码
2006/11/04 Javascript
国外的为初学者写的JavaScript教程
2008/06/09 Javascript
关于js类的定义
2011/06/28 Javascript
js中更短的 Array 类型转换
2011/10/30 Javascript
JavaScript 创建运动框架的实现代码
2013/05/08 Javascript
intro.js 页面引导简单用法 分享
2013/08/06 Javascript
Jquery实现的角色左右选择特效
2014/05/21 Javascript
javaScript使用EL表达式的几种方式
2014/05/27 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
JS判断字符串字节数并截取长度的方法
2016/03/05 Javascript
用JS动态改变表单form里的action值属性的两种方法
2016/05/25 Javascript
Node.js调试技术总结分享
2017/03/12 Javascript
Vue项目分环境打包的实现步骤
2018/04/02 Javascript
vue spa应用中的路由缓存问题与解决方案
2019/05/31 Javascript
layui 实现表单和文件上传一起传到后台的例子
2019/09/16 Javascript
vue请求数据的三种方式
2020/03/04 Javascript
vue路由权限校验功能的实现代码
2020/06/07 Javascript
js实现简单选项卡制作
2020/08/05 Javascript
OpenLayers实现图层切换控件
2020/09/25 Javascript
Python中使用 Selenium 实现网页截图实例
2014/07/18 Python
Python连接mssql数据库编码问题解决方法
2015/01/01 Python
Python Pandas批量读取csv文件到dataframe的方法
2018/10/08 Python
详解Python使用Plotly绘图工具,绘制甘特图
2019/04/02 Python
Pytorch训练过程出现nan的解决方式
2020/01/02 Python
django配置app中的静态文件步骤
2020/03/27 Python
全球最大运动品牌的男装、女装和童装官方库存商:A&A Sports
2021/01/17 全球购物
做一个有道德的人活动实施方案
2014/08/23 职场文书
2014年司法局工作总结
2014/12/11 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
Python+Appium新手教程
2021/04/17 Python