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 eval和JSON之间的联系
Dec 31 Javascript
用RadioButten或CheckBox实现div的显示与隐藏
Sep 21 Javascript
javascript监听鼠标滚轮事件浅析
Jun 05 Javascript
JavaScript charCodeAt方法入门实例(用于取得指定位置字符的Unicode编码)
Oct 17 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
Feb 26 Javascript
js跨域请求的5中解决方式
Jul 02 Javascript
JS代码防止SQL注入的方法(超简单)
Apr 12 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
Nov 07 Javascript
js实现小窗口拖拽效果
Dec 03 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
Dec 06 Javascript
微信小程序页面间传值与页面取值操作实例分析
Apr 30 Javascript
浅谈JS的原型和原型链
Jun 04 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生成文件
2007/01/15 PHP
PHP动态创建Web站点的方法
2011/08/14 PHP
推荐一款MAC OS X 下php集成开发环境mamp
2014/11/08 PHP
基于Jquery实现的一个图片滚动切换
2012/06/21 Javascript
Script标签与访问HTML页面详解
2014/01/10 Javascript
PHP开发者必须掌握的6个关键字
2014/04/14 Javascript
jQuery基础语法实例入门
2014/12/23 Javascript
javascript正则表达式之search()用法实例
2015/01/19 Javascript
基于zepto的移动端轻量级日期插件--date_picker
2016/03/04 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
2016/12/30 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
2017/03/09 Javascript
微信小程序调用PHP后台接口 解析纯html文本
2017/06/13 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
2017/07/20 Javascript
Easyui和zTree两种方式分别实现树形下拉框
2017/08/04 Javascript
Vue + Vue-router 同名路由切换数据不更新的方法
2017/11/20 Javascript
Vue入门之数据绑定(小结)
2018/01/08 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
vue通过过滤器实现数据格式化
2020/07/20 Javascript
原生JavaScript实现购物车
2021/01/10 Javascript
原生js实现放大镜组件
2021/01/22 Javascript
使用Python的Tornado框架实现一个简单的WebQQ机器人
2015/04/24 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
基于python log取对数详解
2018/06/08 Python
selenium+python自动化测试环境搭建步骤
2019/06/03 Python
Django websocket原理及功能实现代码
2020/11/14 Python
使用OpenCV校准鱼眼镜头的方法
2020/11/26 Python
Python模拟键盘输入自动登录TGP
2020/11/27 Python
摩顿布朗英国官方网上商店:奢华沐浴、身体和头发护理
2016/10/29 全球购物
墨尔本照明批发商店:Mica Lighting
2017/12/28 全球购物
波兰最大的儿童服装连锁店之一:5.10.15.
2018/02/11 全球购物
教师岗位职责
2013/11/17 职场文书
单位委托书怎么写
2014/09/21 职场文书
拒绝盗图!教你怎么用python给图片加水印
2021/06/04 Python
spring 项目实现限流方法示例
2022/07/15 Java/Android