Vue Router里的name有啥用?怎么用才高效?
学Vue Router的时候,不少同学都会疑惑“路由配置里的name属性到底有啥用?不加name行不行?不同场景咋用name更顺手?”其实name在Vue Router里是个挺关键的小属性,把它玩明白能解决不少开发里的麻烦事儿,今天咱就从多个场景唠唠Vue Router的name,看看它到底咋帮我们优化开发、避免踩坑~
Vue Router的name,本质是给路由“贴身份证”
Vue Router里的路由配置,就像给不同页面/组件规划“路线”,每个路由配置对象里的name
,相当于给这条“路线”发个唯一身份证,举个例子:
const routes = [ { path: '/home', name: 'HomeRoute', component: Home }, { path: '/user/:id', name: 'UserProfile', component: User } ]
这里HomeRoute
和UserProfile
就是路由的名字。为啥要搞这个“身份证”? 因为路由多了以后,光靠path
匹配容易出问题,比如后期要改/home
为/index
,要是代码里到处用this.$router.push('/home')
,改路径就得全局替换;但如果用name
,路由配置里改path
,代码里导航用this.$router.push({ name: 'HomeRoute' })
,完全不用动业务代码,维护性直接拉满~
而且路由的name
是路由记录(route record)的标识,Vue Router内部匹配路由、管理路由栈的时候,name
能帮它更精准找到对应的路由配置,避免因为路径规则复杂(比如带参数、通配符)导致匹配错误。
编程式导航里,name比path“聪明”在哪?
做页面跳转时,常见两种方式:用path写死路径 和 用name配合参数,咱对比下差别就懂name的好:
(1)路径变了,name能“抗揍”
假设产品经理说“用户页路径从/user
改成/member
”,如果之前导航用的是this.$router.push('/user')
,那所有跳转的地方都得改;但如果用name
,路由配置改成:
{ path: '/member', // 路径变了 name: 'UserProfile', // name不变 component: User }
业务代码里的this.$router.push({ name: 'UserProfile' })
完全不用动,因为name
才是路由的“身份证”,路径只是“外在表现”。
(2)传参时,name配params更“安全”
动态路由传参(比如用户ID)时,用name + params
比path + query
舒服太多,看例子:
// 用name + params this.$router.push({ name: 'UserProfile', params: { id: 123 } }) // 对应的路由配置path得是'/user/:id',这样参数会被解析到$route.params里 // 用path + query this.$router.push('/user?id=123') // 参数在$route.query里,还得自己解析,而且路径可读性差
更关键的是:用name传params时,参数是“绑定”到路由配置的动态段的,如果路由配置没有对应的:id
,params会被忽略(变成查询参数),这其实是种“约束”,强制我们在路由设计阶段就把参数规则理清楚,避免传参混乱。
和keep - alive搭档,name帮组件“续命”
Vue里的<keep - alive>
是用来缓存组件实例,避免重复创建销毁的,但它默认缓存所有组件,有时候我们只想缓存特定路由的组件,这时候name
就成了“筛选器”。
步骤:路由name和组件name对应上
路由配置里给路由加name
,同时组件自身的name
要和路由name
保持一致:
// 路由配置 { path: '/home', name: 'Home', // 路由name component: Home } // Home组件 export default { name: 'Home', // 组件name // ... }
然后在<keep - alive>
里用include
指定要缓存的组件name:
<template> <div id="app"> <keep - alive include="Home"> <router - view/> </keep - alive> </div> </template>
这样一来,只有name
为Home
的组件会被缓存,用户从首页跳到其他页面再回来,Home组件的状态(比如表单输入、滚动位置)还在,不用重新渲染,性能直接起飞~
要是路由组件很多,还能搞多个keep - alive
或者用数组include=["Home", "User"]
,精准控制每个路由的缓存策略,比盲目缓存所有组件高效多了。
同一个组件对应多个路由?name帮你“辨身份”
开发中经常遇到多个路由复用同一个组件的情况(比如不同分类页用同一个List组件),这时候路由的name
能帮组件分清“我现在是哪个路由进来的”。
举个栗子:电商项目里,“热销商品”和“新品推荐”用同一个GoodsList
组件,但要显示不同标题和数据,路由配置可以这样写:
const routes = [ { path: '/hot', name: 'HotGoods', component: GoodsList }, { path: '/new', name: 'NewGoods', component: GoodsList } ]
然后在GoodsList
组件里,通过$route.name
判断当前路由:
<template> <div> <h1>{{ title }}</h1> <!-- 列表内容 --> </div> </template> <script> export default { computed: {) { if (this.$route.name === 'HotGoods') { return '热销商品' } else if (this.$route.name === 'NewGoods') { return '新品推荐' } } } } </script>
这样不用为每个路由写重复组件,靠name
区分场景,代码复用性拉满~
命名视图+嵌套路由,name咋玩?
Vue Router支持命名视图(一个页面多个<router - view>
)和嵌套路由(路由里套路由),这时候name
的作用更细分:
(1)命名视图:给不同区域配组件
比如页面分“主体”和“侧边栏”两个区域,各自对应不同组件,路由配置得用components
(注意是复数),键要和<router - view name="xxx">
的name对应:
{ path: '/dashboard', components: { default: MainContent, // 对应<router - view/>(默认name是default) sidebar: Sidebar // 对应<router - view name="sidebar"/> } }
这里路由自身的name
(如果加的话)是给这个路由记录做标识,和视图的name(default
、sidebar
)不是一回事,比如给这个路由加name: 'Dashboard'
,是为了编程式导航时用name: 'Dashboard'
跳转整个页面,而视图的name是用来分配组件到不同区域的。
(2)嵌套路由:父子路由name互不干扰
嵌套路由的配置长这样:
{ path: '/parent', name: 'ParentRoute', component: Parent, children: [ { path: 'child', name: 'ChildRoute', component: Child } ] }
父路由的name
是ParentRoute
,子路由是ChildRoute
,各自独立,编程式导航时,跳转子路由可以用this.$router.push({ name: 'ChildRoute' })
,Vue Router会自动处理嵌套关系,不用手动拼父路径,而且父组件里想跳转到自己的路由,用name: 'ParentRoute'
也很方便,不用担心路径层级问题。
用name的几个“避坑指南”
虽然name好用,但也有几个容易踩的坑,提前避坑少掉头发:
(1)name必须全局唯一
整个路由配置里,所有路由的name
不能重复!比如有两个路由都叫Detail
,Vue Router匹配的时候就懵了,不知道该跳哪个,会导致导航错误,所以起名时尽量带业务前缀(比如GoodsDetail
、OrderDetail
),避免重名。
(2)路由name≠组件name,但最好对应
前面讲keep - alive
时提到,组件要被缓存,得让路由name和组件name一致,但如果组件不是路由专属(比如多个路由复用同一个组件,且不需要缓存),组件name可以和路由name不一样,但为了避免混乱,建议路由级组件的name
和路由配置的name
保持一致,这样逻辑更清晰。
(3)编程式导航用name时,params要配动态路由
如果路由配置的path
没有动态段(比如:id
),却用name + params
传参,params会被忽略,变成查询参数(挂在url后面?id=123
),所以一定要保证:路由path里有对应的动态参数,name传params才会被正确解析到$route.params里。
(4)重复导航要处理
有时候快速连续点击同一个路由(比如按钮点了多次),Vue Router会报“NavigationDuplicated”错误,这时候可以结合name
做判断:比如在点击事件里,先检查当前路由name是否和要跳转的name一致,一致就不跳转;或者用replace
方法替换当前历史记录(this.$router.replace({ name: 'xxx' })
),避免重复记录。
看完这些,是不是觉得Vue Router的name从“不起眼的小属性”变成“开发利器”了?总结下:name是路由的唯一标识,能让导航更灵活、组件缓存更精准、多路由复用更清晰,还能在复杂路由结构(嵌套、命名视图)里保持逻辑不乱,只要把name的用法和坑摸透,Vue路由这块的开发效率和代码可维护性能提升一大截~下次写路由配置时,别忘给每个路由安排个合适的name,让它帮你省心又省力~
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。