文章目录

  • 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 嵌套路由

通过路由实现组件的嵌套展示,叫做嵌套路由。

vueaxios重定向的结果 vue重定向的作用_前端

嵌套路由的实现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对象访问到动态匹配的参数值。

vueaxios重定向的结果 vue重定向的作用_前端_02


所以可以在路由渲染出来的组件中使用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中的参数

vueaxios重定向的结果 vue重定向的作用_前端_03

注意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 的值