面试题答案
一键面试嵌套路由性能优化
- 路由懒加载:使用ES6的动态导入语法来实现路由组件的懒加载。在
router/index.js
中,对于嵌套路由的组件,可以这样写:
const UserList = () => import('@/views/user/UserList.vue');
const UserDetail = () => import('@/views/user/UserDetail.vue');
const routes = [
{
path: '/user',
name: 'User',
component: () => import('@/views/user/User.vue'),
children: [
{
path: 'list',
name: 'UserList',
component: UserList
},
{
path: 'detail/:id',
name: 'UserDetail',
component: UserDetail
}
]
}
];
这样只有在访问到对应的路由时,组件才会被加载,减少初始加载的文件大小。
- keep - alive 缓存组件:对于不需要重复渲染的嵌套路由组件,使用
<keep - alive>
进行缓存。在父组件的模板中:
<template>
<div>
<keep - alive>
<router - view></router - view>
</keep - alive>
</div>
</template>
这样当切换嵌套路由时,被缓存的组件不会重新创建和销毁,从而提高性能。
权限控制和数据预处理
- 全局导航守卫:在
router/index.js
中定义全局导航守卫,用于对所有嵌套路由进行统一的权限验证和数据预处理。例如:
router.beforeEach((to, from, next) => {
const isAuthenticated = checkAuth();// 假设这是一个检查用户是否登录的函数
if (to.meta.requiresAuth &&!isAuthenticated) {
next('/login');
} else {
// 进行数据预处理,如加载用户信息
loadUserData();
next();
}
});
在路由配置中,可以通过meta
字段来标记需要权限的路由:
const routes = [
{
path: '/user',
name: 'User',
component: () => import('@/views/user/User.vue'),
meta: { requiresAuth: true },
children: [
{
path: 'list',
name: 'UserList',
component: UserList
},
{
path: 'detail/:id',
name: 'UserDetail',
component: UserDetail
}
]
}
];
- 路由独享守卫:对于特定的嵌套路由,可以使用路由独享守卫进行权限控制和数据预处理。在路由配置中:
const routes = [
{
path: '/user',
name: 'User',
component: () => import('@/views/user/User.vue'),
children: [
{
path: 'list',
name: 'UserList',
component: UserList,
beforeEnter: (to, from, next) => {
const hasPermission = checkListPermission();// 检查是否有查看列表的权限
if (hasPermission) {
next();
} else {
next('/forbidden');
}
}
},
{
path: 'detail/:id',
name: 'UserDetail',
component: UserDetail
}
]
}
];
- 组件内导航守卫:在嵌套路由组件内部,可以定义导航守卫来进行组件特定的数据预处理和权限控制。例如在
UserDetail.vue
中:
export default {
beforeRouteEnter(to, from, next) {
const canViewDetail = checkDetailPermission(to.params.id);
if (canViewDetail) {
next();
} else {
next('/forbidden');
}
},
beforeRouteUpdate(to, from, next) {
// 当路由参数变化时,进行数据更新
this.fetchUserData(to.params.id);
next();
}
};