欢迎访问宙启技术站
智能推送

vue 路由嵌套高亮问题的解决方法

发布时间:2023-05-14 09:27:38

在使用 Vue 进行前端开发时,路由嵌套是非常普遍的操作。但是,很多开发者会遇到一个问题,就是当一个页面嵌套了多个子路由时,如何在导航菜单中正确地显示路由高亮状态。

为了解决这个问题,我们需要采取一些措施来处理路由嵌套和高亮状态。下面我们就来逐一讲解这些措施。

## 1、使用 router-link-active

Vue Router 提供了一个非常实用的组件 router-link-active 来处理路由高亮问题。当一个路由匹配时,router-link-active 会自动添加一个类名来高亮菜单项。

使用方法是将该组件绑定到一个路由链接上即可,例如:

<router-link to="/" v-bind:class="{ 'active': $route.path === '/' }">Home</router-link>

上面的代码中,我们使用了 class 绑定语法和 $route.path 属性来判断当前路由是否与链接匹配,如果匹配则添加 active 类名。

但是,如果嵌套的路由比较多,每个菜单项都需要添加这段代码,会显得比较冗杂。而且,在子路由中的 <router-link> 没有办法高亮父级菜单项。因此,我们需要采用更高效的方法。

## 2、使用 router.currentRoute.matched

router.currentRoute.matched 属性可以获取当前路由的所有嵌套路由信息。通过对该属性进行处理,我们可以只需要添加一次高亮指令就可以达到自动高亮的效果。

我们可以新建一个 directive 来实现这个操作:

Vue.directive('active-link', {
  bind: function(el, binding, vnode) {
    const currentPath = vnode.context.$route.path;
    const routerMeta = vnode.context.$route.matched;
    for(const meta of routerMeta) {
      const { path } = meta;
      if(currentPath.indexOf(path) === 0) {
        el.classList.add(binding.value);
      }
    }
  },
  update: function(el, { value }) {
    el.classList.remove(value);
  }
});

上面的代码中,我们先通过 currentPath 获取当前路由的路径。然后使用 router.currentRoute.mathced 来遍历所有嵌套路由信息,找到与当前路由匹配的菜单项,并添加对应的类名。最后在 update 钩子中移除类名。

这种方法相对来说要更加高效,而且能够自动高亮父级菜单项。

## 3、使用 Vue Router 自带的路由守卫

Vue Router 还提供了一种更为高效的方法来处理路由高亮,那就是使用路由守卫。通过在路由守卫中处理路由高亮的逻辑,可以使代码更加简洁而且性能更佳。

我们可以使用 beforeEach 路由守卫来实现路由高亮。在该守卫中,我们对当前路由的嵌套路由信息进行遍历,并找到与当前路由匹配的子路由,然后在导航菜单中高亮对应的菜单项。

具体的实现方法如下:

router.beforeEach((to, from, next) => {
  const { matched } = to;
  const activeRoute = matched[matched.length - 1];
  const activePath = activeRoute.path;

  // 获取导航菜单元素
  const navMenu = document.querySelector('.nav-menu');
  if(navMenu) {
    const activeLink = navMenu.querySelector('.active');
    if(activeLink) {
      activeLink.classList.remove('active');
    }
    const currentLink = navMenu.querySelector([href="${activePath}"]);
    if(currentLink) {
      currentLink.classList.add('active');
    }
  }
  next();
});

上面的代码我们使用 beforeEach 守卫来拦截每一个路由跳转,然后获取到当前路由的嵌套路由信息,找到匹配的子路由,并在导航菜单中高亮对应的菜单项。由于该方法直接操作 DOM 元素,因此需要小心使用。

以上就是几种解决路由嵌套高亮问题的方法。根据实际情况,我们可以选择其中一种或多种方法来处理路由高亮问题。总之,在处理路由嵌套时,正确地处理路由高亮是前端开发中一个非常重要的问题。