Vue异步组件处理路由组件加载状态的解决方案
程序员文章站
2023-11-12 23:47:52
vue.js 组件
组件(component)是 vue.js 最强大的功能之一。
组件可以扩展 html 元素,封装可重用的代码。
在大型单页面应用中,处于对性...
vue.js 组件
组件(component)是 vue.js 最强大的功能之一。
组件可以扩展 html 元素,封装可重用的代码。
在大型单页面应用中,处于对性能的考虑和首屏加载速度的要求,我们一般都会使用webpack的代码分割和vue-router的路由懒加载功能将我们的代码分成一个个模块,并且只在需要的时候才从服务器加载一个模块。
但是这种解决方案也有其问题,当网络环境较差时,我们去首次访问某个路由模块,由于加载该模块的资源需要一定的时间,那么该段时间内,我们的应用就会处于无响应的状态,用户体验极差。
解决方案
这种情况,我们一方面可以缩小路由模块代码的体积,静态资源使用cdn存储等方式缩短加载时间,另一方面则可以路由组件上使用异步组件,显示loading和error等状态,使用户能够得到清晰明了的操作反馈。
具体实现
声明方法,基于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异步组件处理路由组件加载状态的解决方案,希望对大家有所帮助
推荐阅读
-
Vue异步组件处理路由组件加载状态的解决方案
-
vue实现路由懒加载及组件懒加载的方式
-
Vue动态加载异步组件的方法
-
Vue3异步数据加载组件suspense的使用方法
-
vue项目实现按需加载的3种方式:vue异步组件、es提案的import()、webpack的require.ensure()
-
vue项目实现按需加载的3种方式:vue异步组件、es提案的import()、webpack的require.ensure()...
-
解决vue动态路由异步加载import组件,加载不到module的问题
-
vue+webpack实现异步组件加载的方法
-
vue路由组件按需加载的几种方法小结
-
vue router动态路由下让每个子路由都是独立组件的解决方案