3 vue-router 的高级用法
3.1 路由重定向
路由重定向指的是:用户在访问地址 A 的时候,强制用户跳转到地址 C ,从而展示特定的组件页面。
通过路由规则的 redirect 属性,指定一个新的路由地址,可以很方便地设置路由的重定向。
路由重定向Vue2与Vue3相同。
// 重定向的路由规则 { path: '/', redirect: '/home' },
当访问的地址为 ‘/’ 时,会跳转到 ‘/home’ 。
// 创建路由的实例对象 const router = new VueRouter({ // routes 是一个数组,作用:定义 “hash 地址” 与 “组件” 之间的对应关系 routes: [ // 重定向的路由规则 { path: '/', redirect: '/home' }, // 路由规则 { path: '/home', component: Home }, { path: '/movie', component: Movie }, { path: '/about', component: About } ] })
3.2 嵌套路由
通过路由实现组件的嵌套展示,叫做嵌套路由。
嵌套路由的实现Vue2与Vue3相同。
3.2.1 嵌套路由的实现步骤
① 声明子路由链接和子路由占位符
② 在父路由规则中,通过 children 属性嵌套声明子路由规则
3.2.2 声明子路由链接和子路由占位符
在 About.vue 组件中,声明 tab1 和 tab2 的子路由链接以及子路由占位符。
<template> <div class="about-container"> <h3>About 组件</h3> <!-- 子级路由链接 --> <router-link to="/about">tab1</router-link> <router-link to="/about/tab2">tab2</router-link> <hr /> <!-- 子级路由占位符 --> <router-view></router-view> </div> </template> <script> export default { name: 'About' } </script> <style lang="less" scoped> .about-container { min-height: 200px; background-color: skyblue; padding: 15px; > a { margin-right: 10px; } } </style>
3.2.3 通过 children 属性声明子路由规则
// 创建路由的实例对象 const router = new VueRouter({ // routes 是一个数组,作用:定义 “hash 地址” 与 “组件” 之间的对应关系 routes: [ // 重定向的路由规则 { path: '/', redirect: '/home' }, // 路由规则 { path: '/home', component: Home }, { path: '/movie', component: Movie}, { path: '/about', component: About, //当访问 '/about'时默认访问 '/about/tab1' redirect: '/about/tab1', children: [ // 子路由规则 //访问 '/about/tab1' 展示 Tab1 组件 { path: 'tab1', component: Tab1 }, //访问 '/about/tab2' 展示 Tab2 组件 { path: 'tab2', component: Tab2 } ] } ] })
3.2.4 默认子路由
默认子路由:
如果 children 数组中,某个路由规则的 path 值为空字符串,则这条路由规则,叫做“默认子路由”。访问路由时,会默认访问默认子路由。
所以要设置默认访问的组件,可以使用重定向也可以使用默认子路由。
默认子路由示例:
// 创建路由的实例对象 const router = new VueRouter({ // routes 是一个数组,作用:定义 “hash 地址” 与 “组件” 之间的对应关系 routes: [ // 重定向的路由规则 { path: '/', redirect: '/home' }, // 路由规则 { path: '/home', component: Home }, { path: '/movie', component: Movie }, { path: '/about', component: About, // 重定向 // redirect: '/about/tab1', children: [ // 子路由规则 // 访问 '/about' 时默认访问 '/about'下的 Tab1 { path: '', component: Tab1 }, { path: 'tab2', component: Tab2 } ] } ] })
3.3 动态路由匹配
嵌套路由的实现Vue2与Vue3相同。
动态路由指的是:
把 Hash 地址中可变的部分定义为参数项,从而提高路由规则的复用性。
在 vue-router 中使用英文的冒号(:
)来定义路由的参数项。
3.3.1 动态路由的使用
路由连接的声明如下:
<router-link to="/movie/1">洛基</router-link> <router-link to="/movie/2">雷神</router-link> <router-link to="/movie/3">复联</router-link>
要实现将如下的三行合并成一行,提高路由的复用性:
{ path: '/movie/1', component: Movie }, { path: '/movie/2', component: Movie }, { path: '/movie/3', component: Movie }
路由中的动态参数使用 :
进行声明,冒号后面是动态参数的名称。
合并代码如下:
{ path: '/movie/:id', component: Movie },
可以在对应组件中根据动态传入的参数 id 值来动态渲染组件。
如何获取动态传入的参数,如下:
3.3.2 $route.params 参数对象
在动态路由渲染出来的组件中,可以使用this.$route.params
对象访问到动态匹配的参数值。
所以可以在路由渲染出来的组件中使用this.$route.params
获取动态匹配的参数值。
<template> <div class="movie-container"> <!-- this.$route 是路由的“参数对象” --> <!-- this.$router 是路由的“导航对象” --> <h3>Movie 组件 --- {{ $route.params.mid }}</h3> <button @click="showThis">打印 this</button> </div> </template> <script> export default { name: 'Movie', methods: { showThis() { console.log(this) } } } </script> <style lang="less" scoped> .movie-container { min-height: 200px; background-color: lightsalmon; padding: 15px; } </style>
3.3.3 使用 props 接收路由参数
为了简化路由参数的获取形式,vue-router 允许在路由规则中开启 props 传参。
Movie.vue
<template> <div class="movie-container"> <!-- this.$route 是路由的“参数对象” --> <!-- this.$router 是路由的“导航对象” --> <h3>Movie 组件 --- {{ $route.params.mid }} --- {{ mid }}</h3> <button @click="showThis">打印 this</button> </div> </template> <script> export default { name: 'Movie', // 接收 props 数据 props: ['mid'], methods: { showThis() { console.log(this) } } } </script> <style lang="less" scoped> .movie-container { min-height: 200px; background-color: lightsalmon; padding: 15px; } </style>
路由规则:
// 创建路由的实例对象 const router = new VueRouter({ // routes 是一个数组,作用:定义 “hash 地址” 与 “组件” 之间的对应关系 routes: [ // 重定向的路由规则 { path: '/', redirect: '/home' }, // 路由规则 { path: '/home', component: Home }, // 需求:在 Movie 组件中,希望根据 id 的值,展示对应电影的详情信息 // 可以为路由规则开启 props 传参,从而方便的拿到动态参数的值 { path: '/movie/:mid', component: Movie, props: true }, { path: '/about', component: About, // redirect: '/about/tab1', children: [ // 子路由规则 // 默认子路由:如果 children 数组中,某个路由规则的 path 值为空字符串,则这条路由规则,叫做“默认子路由” { path: '', component: Tab1 }, { path: 'tab2', component: Tab2 } ] }, { path: '/login', component: Login }, { path: '/main', component: Main } ] })
App.vue
<template> <div class="app-container"> <h1>App 组件</h1> <router-link to="/home">首页</router-link> <router-link to="/movie/1">洛基</router-link> <router-link to="/movie/2">雷神</router-link> <router-link to="/movie/3">复联</router-link> <router-link to="/about">关于</router-link> <hr /> <!-- 只要在项目中安装和配置了 vue-router,就可以使用 router-view 这个组件了 --> <!-- 它的作用很单纯:占位符 --> <router-view></router-view> </div> </template> <script> export default { name: 'App' } </script> <style lang="less" scoped> .app-container { background-color: #efefef; overflow: hidden; margin: 10px; padding: 15px; > a { margin-right: 10px; } } </style>
3.3.4 route中的参数
注意1:
在 hash 地址中, / 后面的参数项,叫做“路径参数”
在路由“参数对象”中,需要使用 this.$route.params 来访问路径参数
注意2:
在 hash 地址中,? 后面的参数项,叫做“查询参数”
在路由“参数对象”中,需要使用 this.$route.query 来访问查询参数
<router-link to="/movie/2?name=zs&age=20">雷神</router-link>
注意3:
在 this.$route 中,path 只是路径部分;fullPath 是完整的地址
例如:
/movie/2?name=zs&age=20 是 fullPath 的值
/movie/2 是 path 的值