Skip to content

动态路由基本匹配

很多时候我们需要将给定匹配模式的路由映射到同一个组件:

  • 例如,我们可以有一个User组件,它应该对所有用户进行渲染,但是用户的id是不同的
  • 再Vue Router中,我们可以再路径中使用一个动态字段来实现,我们称之为路径参数

例子:

javascript
{ path: "/user/:id", component: () => import("../User.vue") }

获取动态路由的值

在user中如何获取到对应的值呢?

  • 在template中,直接通过$route.params获取值
  • 在created中,通过this.$route.params获取值
  • 在setup中,我们要使用vue-router库给我们提供的一个hook:useRouter
    • 该hook会返回一个Route对象,对象中保存着当前路由相关的值

例子:

vue
<template>
    <!-- 再模板中获取到id -->
    <h2>UserID:{{ $route.params.id }}</h2>
</template>

<script setup>
import { useRoute } from 'vue-router';

// 获取route跳转id
const route = useRoute()
console.log(route.params.id)

</script>

NotFound页面的匹配和显示

  • path: "/:pathMatch(.*)"

index.js

javascript
{ path: "/:pathMatch(.*)", component: () => import("../NotFound.vue") }

NotFound.vue

vue
<template>
    <h2>NotFound: 请您输入正确的网址喵(*=^ w ^=*)~</h2>
</template>
  • 如果在/:pathMatch(.*)后面又加上了一个*,则会解析网址

函数式路由跳转

  • 注意:引入的是router
  • 可以使用query

例子:

vue
<button @click="btnClick">点我回到首页</button>
vue
<h4>Info: {{ $route.query.name }} - {{ $route.query.age }}</h4>
vue
<script setup>
  import { useRouter } from 'vue-router';

  const router = useRouter()

  function btnClick() {
    router.push({
      path: "/home",
      query: {
        name: 'Irie',
        age: 19
      }
    })
  }
</script>

动态添加路由

在某些情况下我们可能需要动态的来添加路由:

  • 比如根据用户不同的权限,注册不同的路由
  • 这个时候我们可以使用一个方法addRoute

例子:

index.js

javascript
let isAdmin = true
if (isAdmin) {
    // 添加一级路由
    router.addRoute({
        path: '/admin',
        component: () => import("../Admin.vue")
    })

    // 添加二级路由
    router.addRoute("home", {
        path: "vip",
        component: () => import("../HomeVip.vue")
    })
}
  • 在添加二级路由的时候,addRoute的第一个参数是上一级路由设置的独一无二的name