MST

星途 面试题库

面试题:Vue Router在Vue 3中如何实现嵌套路由的优化及导航守卫应用

在Vue 3项目里,假设存在一个多层嵌套路由的场景,如用户管理模块下有用户列表、用户详情等嵌套路由。请说明如何对嵌套路由进行性能优化,并且阐述如何在嵌套路由的切换过程中合理使用全局导航守卫、路由独享守卫和组件内导航守卫来实现权限控制和数据预处理等功能。
31.9万 热度难度
前端开发Vue

知识考点

AI 面试

面试题答案

一键面试

嵌套路由性能优化

  1. 路由懒加载:使用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
      }
    ]
  }
];

这样只有在访问到对应的路由时,组件才会被加载,减少初始加载的文件大小。

  1. keep - alive 缓存组件:对于不需要重复渲染的嵌套路由组件,使用<keep - alive>进行缓存。在父组件的模板中:
<template>
  <div>
    <keep - alive>
      <router - view></router - view>
    </keep - alive>
  </div>
</template>

这样当切换嵌套路由时,被缓存的组件不会重新创建和销毁,从而提高性能。

权限控制和数据预处理

  1. 全局导航守卫:在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
      }
    ]
  }
];
  1. 路由独享守卫:对于特定的嵌套路由,可以使用路由独享守卫进行权限控制和数据预处理。在路由配置中:
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
      }
    ]
  }
];
  1. 组件内导航守卫:在嵌套路由组件内部,可以定义导航守卫来进行组件特定的数据预处理和权限控制。例如在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();
  }
};