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 Select标记中options操作方法集合
Oct 22 Javascript
javascript中使用css需要注意的地方小结
Sep 01 Javascript
使用jQuery+HttpHandler+xml模拟一个三级联动的例子
Aug 09 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
Apr 08 Javascript
javascript中使用new与不使用实例化对象的区别
Jun 22 Javascript
详解Javascript事件驱动编程
Jan 03 Javascript
javascript跑马灯抽奖实例讲解
Apr 17 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
Jun 27 Javascript
详解AngularJS controller调用factory
May 19 Javascript
详解在create-react-app使用less与antd按需加载
Dec 06 Javascript
JavaScript中交换值的10种方法总结
Aug 18 Javascript
node.js使用express-fileupload中间件实现文件上传
Jul 16 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 星际争霸
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
php设计模式之委托模式
2016/02/13 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
Thinkphp 框架扩展之行为扩展原理与实现方法分析
2020/04/23 PHP
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
2014/01/09 Javascript
jquery实现页面图片等比例放大缩小功能
2014/02/12 Javascript
JS实现将人民币金额转换为大写的示例代码
2014/02/13 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
js变量、作用域及内存详解
2014/09/23 Javascript
常用的Javascript设计模式小结
2015/12/09 Javascript
JS中使用 after 伪类清除浮动实例
2017/03/01 Javascript
深入讲解xhr(XMLHttpRequest)/jsonp请求之abort
2017/07/26 Javascript
微信小程使用swiper组件实现图片轮播切换显示功能【附源码下载】
2017/12/12 Javascript
javascript实现数字配对游戏的实例讲解
2017/12/14 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
2019/09/11 Javascript
layui 实现表单和文件上传一起传到后台的例子
2019/09/16 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
Js实现复选框的全选、全不选反选功能代码实例
2020/02/28 Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
2020/04/21 Javascript
pytorch 预训练层的使用方法
2019/08/20 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
Python实现名片管理系统
2020/02/14 Python
解决tensorboard多个events文件显示紊乱的问题
2020/02/15 Python
详解python内置常用高阶函数(列出了5个常用的)
2020/02/21 Python
如何利用python读取micaps文件详解
2020/10/18 Python
巴西Mr. Cat在线商店:购买包包和鞋子
2019/09/08 全球购物
介绍Ibatis的核心类
2013/11/18 面试题
文秘档案管理岗位职责
2014/03/06 职场文书
新学期教师寄语
2014/04/02 职场文书
学校对教师的评语
2014/04/28 职场文书
体操比赛口号
2014/06/10 职场文书
2014年有孩子的离婚协议书范本
2014/10/08 职场文书