多级路由
在Vue路由生态里,支持配置二级、三级、四级等多级路由,理论上没有上限,实际业务中用到的级数通常是三级到四级
比如你做一个美食类网站,打算在 “中餐” 大分类下配置一个 “饺子” 栏目,那么地址就是:
1 | https://chengpeiquan.com/chinese-food/dumplings |
这种情况下,中餐 chinese-food
就是一级路由,饺子 dumplings
就是二级路由。
如果你想再细化一下,“饺子” 下面再增加一个 “韭菜” 、“白菜” 等不同馅料的子分类:
1 | https://chengpeiquan.com/chinese-food/dumplings/chives |
这里的韭菜 chives``dumplings
这是一个简单的子路由示范:
1 | const routes: Array<RouteRecordRaw> = [ |
最终线上的访问地址,比如要访问三级路由:
1 | https://chengpeiquan.com/lv1/lv2/lv3 |
使用 route 获取路由信息
和 2.x 可以直接在组件里使用 this.$route
来获取当前路由信息不同,在3.x 的组件里,Vue实例既没有了 this
,也没有了 $route
。
要牢记一个事情就是,3.x 用啥都要导入,所以,获取当前路由信息的正确用法是:
1、导入路由组件
1 | import { useRoute } from 'vue-router' |
2、定义路由变量
刚刚导入的 useRoute
是一个函数,需要在 setup
里定义一个变量来获取路由信息。
1 | const route = useRoute(); |
3、读取路由信息
接下来就可以通过定义好的变量 route
去获取当前路由信息了。
当然,如果要在 template
里使用路由,记得把 route
在 setup
里return出去。
1 | // 获取路由名称 |
WARNING
但是 3.x 的新路由也有一些小变化,有一些属性是被移除了,比如之前获取父级路由信息,很喜欢用的
parent
属性,现在已经没有了 点击查看原因
类似被移除的 parent
,如果要获取父级路由信息(比如你在做面包屑功能的时候),可以改成下面这样,手动指定倒数第二个为父级信息:
1 | // 获取路由记录 |
如果有配置父级路由,那么刚刚的 ROUTE_PARENT
就是父级路由信息了
使用-router-操作路由-new
和 route
一样,在 3.x 也不再存在 this.$router
,也必须通过导入路由组件来使用。
1、导入路由组件
1 | import { useRouter } from 'vue-router' |
2、定义路由变量
和 useRoute
一样, useRouter
也是一个函数,需要在 setup
里定义一个变量来获取路由信息。
1 | const router = useRouter(); |
3、操作路由
接下来就可以通过定义好的变量 router
去操作路由了。
1 | // 跳转首页 |
使用 router-link 标签跳转
router-link
是一个路由组件,可直接在 template
里使用,基础的用法在 2.x 和 3.x 一样。
默认会被转换为一个 a
标签,对比写死的 <a href="...">
,使用 router-link
会更加灵活。
基础跳转
最基础的用法就是把它当成一个 target="_self"
的a标签使用,但无需重新刷新页面,因为是路由跳转,它的体验和使用 router
去进行路由导航的效果完全一样。
1 | <template> |
等价于 router
的 push
:
1 | router.push({ |
你可以写个 span
然后绑定 click
事件来达到 router-link
的效果(但你看是不是麻烦很多emm…
1 | <template> |
带参数的跳转
使用 router
的时候,可以轻松的带上参数去那些有id的内容页、用户资料页、栏目列表页等等。
比如你要访问一篇文章 https://chengpeiquan.com/article/123
,用 push
的写法是:
1 | router.push({ |
同理,从基础跳转的写法,很容易就能get到在 router-link
里应该怎么写:
1 | <template> |
不生成 a 标签
router-link
默认是被转换为一个 a
标签,但根据业务场景,你也可以把它指定为生成其他标签,比如 span
、 div
、 li
等等,这些标签因为不具备 href
属性,所以在跳转时都是通过 click
事件去执行。
在 2.x,指定为其他标签只需要一个 tag
属性即可:
1 | <template> |
但在 3.x ,tag
属性已被移除,需要通过 custom
和 v-slot
的配合来渲染为其他标签。
比如要渲染为一个带有路由导航功能的 div
:
1 | <template> |
渲染后就是一个普通的 span
标签,当你点击的时候,它会通过路由的导航把你带到指定的路由页:
1 | <span class="link">首页</span> |
关于这2个属性,他们的参数说明如下:
custom
,一个布尔值,用于控制是否需要渲染为a
标签,当不包含custom
或者把custom
设置为false
时,则依然使用a
标签渲染。v-slot
是一个对象,用来决定标签的行为,它包含了:
字段 | 含义 |
---|---|
href | 解析后的URL,将会作为一个 a 元素的 href 属性 |
route | 解析后的规范化的地址 |
navigate | 触发导航的函数,会在必要时自动阻止事件,和 router-link 同理 |
isActive | 如果需要应用激活的 class 则为 true ,允许应用一个任意的 class |
isExactActive | 如果需要应用精确激活的 class 则为 true ,允许应用一个任意的 class |
一般来说,v-slot
必备的只有 navigate
,用来绑定元素的点击事件,否则元素点击后不会有任何反应,其他的可以根据实际需求来添加。
TIP
要渲染为非 a
标签,切记两个点:
router-link
必须带上custom
和v-slot
属性- 最终要渲染的标签,写在
router-link
里,包括对应的className
和点击事件