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 相关文章推荐
浅谈tudou土豆网首页图片延迟加载的效果
Jun 23 Javascript
深入理解JavaScript系列(13) This? Yes,this!
Jan 18 Javascript
jQuery 1.8 Release版本发布了
Aug 14 Javascript
jQuery提交多个表单的小例子
Jun 30 Javascript
JQuery结合CSS操作打印样式的方法
Dec 24 Javascript
再谈javascript常见错误及解决方法
Sep 16 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
Dec 22 Javascript
深入理解Angularjs中$http.post与$.post
May 19 Javascript
javascript 产生随机数的几种方法总结
Sep 26 Javascript
vue移动端轻量级的轮播组件实现代码
Jul 12 Javascript
layer.open 按钮的点击事件关闭方法
Aug 17 Javascript
解决vue项目 build之后资源文件找不到的问题
Sep 12 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 URL编码解码函数代码
2009/03/10 PHP
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
使用PHP计算两个路径的相对路径
2013/06/14 PHP
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
php实现字符串翻转的方法
2015/03/27 PHP
PHP rmdir()函数的用法总结
2019/07/02 PHP
xml 与javascript结合的问题解决方法
2007/03/24 Javascript
js indexOf()定义和用法
2012/10/21 Javascript
window.open以post方式将内容提交到新窗口
2012/12/26 Javascript
js获得参数的getParameter使用示例
2014/02/26 Javascript
jQuery对象与DOM对象之间的相互转换
2015/03/03 Javascript
详解JavaScript中循环控制语句的用法
2015/06/03 Javascript
微信小程序之拖拽排序(代码分享)
2017/01/21 Javascript
利用Chrome DevTools直接调试Node.js和JavaScript的方法详解(并行)
2017/02/16 Javascript
vue实现菜单切换功能
2019/05/08 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
JS前端基于canvas给图片添加水印
2020/11/11 Javascript
Vue解决移动端弹窗滚动穿透问题
2020/12/15 Vue.js
[04:40]2016个国际邀请赛中国区预选赛场地——华西村观战指南
2016/06/25 DOTA
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
树莓派中python获取GY-85九轴模块信息示例
2013/12/05 Python
python psutil库安装教程
2018/03/19 Python
ubuntu系统下使用pm2设置nodejs开机自启动的方法
2018/05/12 NodeJs
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
Opencv求取连通区域重心实例
2020/06/04 Python
Python配置pip国内镜像源的实现
2020/08/20 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
2020/12/07 Python
意大利奢侈品多品牌集合店:TheDoubleF
2019/08/24 全球购物
Puma印度官网:德国运动品牌
2019/10/06 全球购物
巴西24小时在线药房:Drogasil
2020/06/20 全球购物
居委会四风问题个人对照检查材料
2014/09/25 职场文书
开业庆典嘉宾致辞
2015/08/01 职场文书
pytorch实现线性回归以及多元回归
2021/04/11 Python
MySQL 8.0 驱动与阿里druid版本兼容问题解决
2021/07/01 MySQL
golang操作redis的客户端包有多个比如redigo、go-redis
2022/04/14 Golang