当前位置:首页 > 技术文章 > 正文内容

Vue Router 中如何获取路由传递过来的参数?

zonemu1周前 (07-25)技术文章8

在 Vue Router 中,获取路由传递的参数主要有以下几种方式:

一、通过 $route 对象获取

在 Vue 组件中,可以直接通过 $route 对象访问路由参数:

1、对于动态路由参数(路径参数):

<template>

<div>用户ID: {{ $route.params.id }} </div>

</template>

2、对于查询参数:

<template>

<div>搜索关键词: {{ $route.query.keyword }} </div>

</template>

3、对于 hash 值:

<template>

<div>Hash: {{ $route.hash }} </div>

</template>

二、使用Composition APl的 useRoute 钩子

在 Vue 3 的组合式 AP| 中,可以使用 useRoute 钩子获取路由参数:

<script setup>

import { useRoute } from 'vue-router'

const route= useRoute();

console.log(route.params.id)//获取路径参数

console.log(route.query.keyword)//获取查询参数

console.1og(route.hash)//获取 hash 值

</script>

三、通过 props 解耦方式获取

为了解耦组件和路由,可以通过配置路由的 props 选项,将路由参数作为组件的 props 传入:

// 路由配置

const routes = [

{

path: '/user/:id',

component: User,

props: true // 将路由参数作为组件 props 传入

}

]

然后在组件中通过 props 接收:

<script setup>

// Composition API

defineProps({

id: string

})

</script>

<template>

<div>用户ID: {{ id }}</div>

</template>

或者在选项式 API中

<script>

export default{

props:{

id: string

}

}

</script>

扩展知识

1)、路由参数的类型

Vue Router 中的路由参数主要有三种类型:

  1. 路径参数(Params):通过路径定义的动态部分,如 /users/:id
  2. 查询参数(Query):URL中?后面的参数,如 /users?role=admin
  3. Hash 值:URL中#后面的部分,如 /users#profile

2)、路由参数的高级配置

路径参数的高级匹配模式

Vue Router 支持在路径参数中使用正则表达式进行更精确的匹配,

// 只匹配数字 ID

{ path: "/users/:id(\\d+)',component: User }

// 匹配可选参数

{ path: '/users/:username?', component: User }

// 匹配多个参数段

{ path: '/:pathMatch(.*)*', component: NotFound }

函数式 props 传递

可以使用函数来处理和转换路由参数:

const routes = [

{

path: '/search',

component: SearchUser,

props: route => ({

query: route.query.q,

page: Number(route.query.page) || 1 // 转换为数字类型

})

}

]

3)、响应路由参数变化

当在同一个组件中路由参数发生变化时(如从 /users/1 导航到 /users/2 ),组件实例会被复用,不会触发生命周期钩子。此时需要监听路由参数的变化:

使用 watch 监听

<script setup>

import { watch } from 'vue'

import { useRoute } from 'vue-router'

const route = useRoute()

watch(() => route.params.id,(newId,oldId) => {

// 路由参数变化时执行的逻辑

console.log(`路由从 ${oldId} 变为 ${newId}`)

// 重新获取数据等操作

})

</script>

使用导航守卫

<script setup>

import { onBeforeRouteUpdate } from 'vue-router'

onBeforeRouteUpdate(async (to,from) => {

// 可以在这里执行异步操作

const userData = await fetchUser(to.params.id)

// 还可以取消导航

})

</script>

4)、实际应用场景

用户详情页: 通过 ID 获取不同用户信息

/users/:id // 获取 route.params.id

产品筛选页: 通过查询参数筛选产品

/products?category=electronics&sort=price // 获取 route.query.category 和 route.query.sort

多级路由参数:嵌套的动态路由


/users/:userId/posts/:postId //
获取 route.params.userId 和 route.params.postId

Vue Router 的官方文档提供了更多详细信息,可以访问以下链接了解更多:

动态路由匹配:
https://router.vuejs.org/zh/guide/essentials/dynamic-matching.html

路由组件传参:
https://router.vuejs.org/zh/guide/essentials/passing-props.html

相关文章

7种超轻量级的Linux发行版,能够帮助你找到适合自己的操作系统

Linux是一种非常受欢迎的开源操作系统,而且有许多版本可以选择。有时候,你需要一种超轻量级的Linux发行版,它可以在资源有限的设备上运行,并且能够快速启动。本文将介绍7种超轻量级的Linux发行版...

微软的Linux发行版终于加入了对XFS根文件系统的支持

当许多Linux发行版在评估新的根文件系统选项或甚至像OpenZFS这样的特性,微软内部Linux发行版到本月才开始支持XFS作为根文件系统选项。随着这个月对微软内部Linux发行版CBL-Marin...

2023 年 10 个最佳 Linux 桌面发行版

Linux 操作系统在桌面领域的发展已经不再被忽视,越来越多的用户正在考虑切换到 Linux 上。在 2023 年,我们可以期待更多的 Linux 桌面发行版的推出和发展。这里列举了 10 个最佳的...

Vue3 中,父子组件如何传递参数?(vue父子组件传递数据方法)

在 Vue3 中,组件化开发是非常重要的特征,那么组件之间传值就是开发中常见的需求了。组件之间的传值三种方式:父传子、子传父、非父子组件传值。一、父传子( defineProps )父组件主要通过使用...

Vue3开发极简入门(14):组件间通信之props、ref&amp;defineExpose

组件间的关系可以分为:父子关系。以前文的代码为例,最典型的就是App.vue与Car.vue这种,APP是父,Car是子。祖孙关系。如果Car再引入一个子组件,这个子组件与App就是祖孙关系。其他。比...

10个实例小练习,快速入门熟练 Vue3 核心新特性(一)

作者:xuying 全栈修炼转发链接:https://mp.weixin.qq.com/s/_n2seDbbiO5hXQfuUGbUCQ前言Vue3.0 发 beta 版都有一段时间了,正式版也不远了...