实现思路
- 路由按需加载:在Vue Router中,使用ES6的动态导入语法(
import()
)来实现组件的懒加载。这样可以在路由切换时才加载对应的组件,而不是在应用启动时就加载所有组件。
- 加载顺序:由于是多层嵌套路由,确保子路由的组件在父路由组件加载完成后再加载。Vue Router会按照路由配置的顺序依次加载组件。
- 加载失败处理:通过
import()
的catch
块来捕获加载失败的错误,并进行相应处理,比如显示错误提示。
- 提升用户体验:在组件加载过程中,显示加载指示器,告知用户正在加载内容,提高用户等待的耐心。
关键代码片段
- 路由配置(
router/index.js
):
import Vue from 'vue';
import Router from 'vue-router';
Vue.use(Router);
const Home = () => import(/* webpackChunkName: "home" */ './views/Home.vue');
const Level1 = () => import(/* webpackChunkName: "level1" */ './views/Level1.vue');
const Level2 = () => import(/* webpackChunkName: "level2" */ './views/Level2.vue');
const Level3 = () => import(/* webpackChunkName: "level3" */ './views/Level3.vue');
const Level4 = () => import(/* webpackChunkName: "level4" */ './views/Level4.vue');
const Level5 = () => import(/* webpackChunkName: "level5" */ './views/Level5.vue');
const router = new Router({
routes: [
{
path: '/',
name: 'Home',
component: Home,
children: [
{
path: 'level1',
name: 'Level1',
component: Level1,
children: [
{
path: 'level2',
name: 'Level2',
component: Level2,
children: [
{
path: 'level3',
name: 'Level3',
component: Level3,
children: [
{
path: 'level4',
name: 'Level4',
component: Level4,
children: [
{
path: 'level5',
name: 'Level5',
component: Level5
}
]
}
]
}
]
}
]
}
]
}
]
});
export default router;
- 加载指示器(以Vuex和
vue-loading-overlay
为例):
npm install vue-loading-overlay --save
// store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
import Loading from 'vue-loading-overlay';
import 'vue-loading-overlay/dist/vue-loading.css';
Vue.use(Vuex);
const store = new Vuex.Store({
state: {
isLoading: false
},
mutations: {
setLoading(state, payload) {
state.isLoading = payload;
}
}
});
// 在main.js中挂载loading组件
import Vue from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import Loading from 'vue-loading-overlay';
import 'vue-loading-overlay/dist/vue-loading.css';
Vue.component('Loading', Loading);
Vue.config.productionTip = false;
router.beforeEach((to, from, next) => {
store.commit('setLoading', true);
next();
});
router.afterEach(() => {
store.commit('setLoading', false);
});
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app');
<template>
<div id="app">
<Loading :is-active="isLoading" :text="loadingText" :spinner="spinner" :color="color" :background="background"/>
<router-view/>
</div>
</template>
<script>
export default {
computed: {
isLoading() {
return this.$store.state.isLoading;
},
loadingText() {
return '加载中...';
},
spinner() {
return 'dots';
},
color() {
return '#1890ff';
},
background() {
return 'rgba(0, 0, 0, 0.3)';
}
}
};
</script>
- 加载失败处理:
const Home = () => import(/* webpackChunkName: "home" */ './views/Home.vue')
.catch(error => {
// 处理加载失败,比如显示全局错误提示
console.error('Home component load failed:', error);
// 这里可以通过Vuex或者其他方式通知用户加载失败
});
const Level1 = () => import(/* webpackChunkName: "level1" */ './views/Level1.vue')
.catch(error => {
console.error('Level1 component load failed:', error);
});
// 其他组件类似