Code前端首页关于Code前端联系我们

1.exact match到底解决啥痛点?

terry 8小时前 阅读数 10 #Vue

在Vue项目里搞路由导航时,你有没有遇到过这种情况?点了某个二级页面,结果首页的导航也跟着高亮;明明想让“/user”的导航只在访问/user时亮,结果访问/user/1它也亮了……这时候十有八九是没搞懂Vue Router的exact match(精确匹配),今天就把exact match的作用、用法、坑点一次性讲明白,解决导航高亮混乱、路由匹配不清的问题~

先讲Vue Router默认的路由匹配逻辑:**模糊匹配(前缀匹配)**,比如你定义了一个路径为`/`的路由,那所有以`/`开头的路径(像`/about`、`/user`、`/product/123`)都会触发这个路由的匹配,反映在``上,就是只要当前路径包含``里的`xxx`,这个导航就会自动加上`active`类(默认是`router-link-active`),导致高亮。

举个实际例子:导航栏有“首页”(to="/")和“关于我们”(to="/about"),默认情况下,当你点进“关于我们”页面(路径是/about),“首页”的导航也会高亮——因为/about的路径是以开头的,符合模糊匹配规则,这显然不符合用户预期:用户明明在“关于我们”,首页却亮了,体验很糟。

而exact match的作用,就是把这种“包含即匹配”改成“完全相等才匹配”,给<router-link>加上exact属性后,只有当当前路径和to的值完全一模一样时,才会添加active类,还是上面的例子,给“首页”的<router-link>exact,访问/about时,“首页”就不会错误高亮了。

怎么给路由导航加exact?

核心就一个:给<router-link>标签加exact属性(不用写值,像布尔属性一样用)。

看代码示例:

<template>
  <nav>
    <!-- 加exact,只有路径是/时才高亮 -->
    <router-link to="/" exact>首页</router-link>
    <router-link to="/about">关于我们</router-link>
    <router-link to="/user" exact>/user页面</router-link>
  </nav>
</template>

这里要注意两个点:

  • exact<router-link>的专属属性,和路由配置里的path没关系,路由配置里的path是控制“哪个路径渲染哪个组件”,而exact是控制“导航什么时候高亮”。
  • 不是所有导航都需要exact!关于我们”(to="/about")这种没有子路径的导航,默认模糊匹配也不会出错(因为其他路径不会以/about为前缀,除非你有/about/xxx的子路由),所以一般只有根路径()有子路径的父级导航(比如/user是父路径,/user/1是子路径)需要加exact

哪些场景必须用exact?

场景1:根路径导航(to="/"
只要项目里有其他子路径(比如/about/product),根路径的<router-link>必须加exact,否则访问任何子路径时,根路径导航都会高亮,用户根本分不清当前在哪个页面。

场景2:存在父子路径的导航
比如有/user(列表页)和/user/1(详情页)两个路径,给/user<router-link>exact后,访问/user/1时,/user的导航就不会错误高亮——用户能清晰看到自己在详情页,而不是列表页。

场景3:多Tab导航且路径结构相似
比如后台管理系统里,有/dashboard/order/dashboard/product两个路径,它们的父路径都是/dashboard,如果给/dashboard<router-link>exact,就能避免访问子路径时父导航错误高亮。

不用exact容易踩哪些坑?

坑1:导航高亮混乱,用户体验差
最直观的就是“该亮的不亮,不该亮的乱亮”,比如用户明明在“订单页面”,结果“首页”和“订单页面”的导航同时高亮,用户根本不知道自己到底在哪。

坑2:逻辑误解:以为路由配置能控制高亮
有人会想:“我把路由配置的path写精确点,是不是就不用exact了?” 大错特错!路由配置的path控制的是“哪个组件渲染”,而<router-link>active类是Vue Router自动根据路径匹配添加的(默认模糊匹配),哪怕你路由配置的path是精确的,只要<router-link>没加exact,高亮逻辑还是模糊匹配。

举个反例:
路由配置写了{ path: '/user', component: User },但<router-link to="/user">没加exact,此时访问/user/1(假设你没给/user/1配路由,Vue Router会走404,但路径还是/user/1),/user的导航依然会高亮——因为路径包含/user,触发了模糊匹配。

exact和路由配置的path匹配有啥区别?

很多人会把这俩搞混,这里直接对比:

对比项 exact属性(<router-link> 路由配置的pathrouter/index.js
作用 控制导航的active类何时添加 控制哪个路径渲染哪个组件
匹配规则 完全相等才匹配 默认前缀匹配(包含即匹配)
作用对象 视觉层:导航高亮 逻辑层:组件渲染

举个场景对比:

  • 路由配置path: '/user' → 当访问/user/user/1/user/edit时,User组件都会渲染(因为前缀匹配)。
  • <router-link to="/user" exact> → 只有访问路径完全是/user时,这个导航才会高亮;访问/user/1时,导航不会高亮。

进阶:exact的原理和源码小窥(懂原理更稳)

Vue Router内部给<router-link>active类做匹配时,默认用的是路径的包含关系(即当前路径是否以to的路径为前缀),当加上exact属性后,匹配逻辑变成严格相等currentPath === toPath)。

从源码角度看(简化理解):

// 伪代码,理解逻辑
function isActive(route, path, exact) {
  if (exact) {
    return route.path === path; // 完全相等
  } else {
    return route.path.startsWith(path); // 前缀匹配(包含)
  }
}

所以exact本质是改变了<router-link>判断“是否激活”的逻辑,从“包含”变成“全等”。

最后总结一下:exact match是Vue Router里控制导航高亮精确性的关键属性,核心解决“模糊匹配导致导航错误高亮”的问题,记住这三点:

  • 根路径和有子路径的父导航必加exact
  • exact<router-link>的属性,和路由配置的path各司其职;
  • 不用exact会导致导航高亮混乱,影响用户体验。

现在回到你的项目里,检查下导航栏的<router-link>,是不是该加exact的地方漏加了?改完后再看导航高亮,是不是清爽多了~

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门