文章目录
- 3 vue-router 的高级用法
- 3.1 路由重定向
- 3.2 嵌套路由
- 3.2.1 嵌套路由的实现步骤
- 3.2.2 声明子路由链接和子路由占位符
- 3.2.3 通过 children 属性声明子路由规则
- 3.2.4 默认子路由
- 3.3 动态路由匹配
- 3.3.1 动态路由的使用
- 3.3.2 $route.params 参数对象
- 3.3.3 使用 props 接收路由参数
- Movie.vue
- 路由规则:
- App.vue
- 3.3.4 route中的参数
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 的值