1.exact match到底解决啥痛点?
在Vue项目里搞路由导航时,你有没有遇到过这种情况?点了某个二级页面,结果首页的导航也跟着高亮;明明想让“/user”的导航只在访问/user时亮,结果访问/user/1它也亮了……这时候十有八九是没搞懂Vue Router的exact match(精确匹配),今天就把exact match的作用、用法、坑点一次性讲明白,解决导航高亮混乱、路由匹配不清的问题~
先讲Vue Router默认的路由匹配逻辑:**模糊匹配(前缀匹配)**,比如你定义了一个路径为`/`的路由,那所有以`/`开头的路径(像`/about`、`/user`、`/product/123`)都会触发这个路由的匹配,反映在`举个实际例子:导航栏有“首页”(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> ) |
路由配置的path (router/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前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。