当前位置: 首页 > news >正文

vue3 vue-router 传递路由参数

在 Vue 3 中,使用 vue-router 传递路由参数是非常常见的需求。

1. 使用动态路由参数(params

动态路由参数是定义在路由规则中的占位符部分,例如 /user/:id。你可以通过 router.push<router-link> 传递这些参数。

(1) 配置动态路由
import { createRouter, createWebHistory } from 'vue-router';

const routes = [
  {
    path: '/user/:id', // 动态参数 :id
    component: () => import('@/views/UserDetail.vue')
  }
];

const router = createRouter({
  history: createWebHistory(),
  routes
});

export default router;
(2) 通过 router.push 传递参数 
import { useRouter } from 'vue-router';

export default {
  setup() {
    const router = useRouter();

    const navigateToUser = (userId) => {
      router.push({ name: 'user', params: { id: userId } }); // 传递参数
    };

    return { navigateToUser };
  }
};
(3) 在目标组件中获取参数
 
import { useRoute } from 'vue-router';

export default {
  setup() {
    const route = useRoute();
    const userId = route.params.id; // 获取动态参数

    return { userId };
  }
};

 

2. 使用查询参数(query

查询参数是 URL 中 ? 后面的部分,例如 /search?name=Vue&id=123。你可以通过 router.push<router-link> 传递查询参数。

(1) 通过 router.push 传递查询参数
import { useRouter } from 'vue-router';

export default {
  setup() {
    const router = useRouter();

    const navigateToSearch = () => {
      router.push({
        path: '/search',
        query: { name: 'Vue', id: 123 } // 传递查询参数
      });
    };

    return { navigateToSearch };
  }
};
(2) 在目标组件中获取查询参数
import { useRoute } from 'vue-router';

export default {
  setup() {
    const route = useRoute();
    const name = route.query.name; // 获取查询参数
    const id = route.query.id;

    return { name, id };
  }
};

 3. 使用命名路由(推荐)

如果你的路由配置中定义了 name 属性,可以通过命名路由传递参数,这样可以避免硬编码路径。

(1) 定义命名路由
const routes = [
  {
    path: '/user/:id',
    name: 'user', // 定义路由名称
    component: () => import('@/views/UserDetail.vue')
  }
];
(2) 通过 router.push 使用命名路由传递参数
import { useRouter } from 'vue-router';

export default {
  setup() {
    const router = useRouter();

    const navigateToUser = (userId) => {
      router.push({
        name: 'user', // 使用路由名称
        params: { id: userId } // 传递动态参数
      });
    };

    return { navigateToUser };
  }
};

4. 使用 <router-link> 传递参数

除了编程式导航(router.push),你还可以通过 <router-link> 传递参数。

(1) 传递动态参数
<template>
  <router-link :to="{ name: 'user', params: { id: 123 } }">
    跳转到用户详情页
  </router-link>
</template>
(2) 传递查询参数
<template>
  <router-link :to="{ path: '/search', query: { name: 'Vue', id: 123 } }">
    跳转到搜索页
  </router-link>
</template>

 5. 区分动态参数和查询参数

类型位置示例 URL获取方式
动态参数 (params)路径中/user/123route.params.id
查询参数 (query)URL 的 ? 后/search?name=Vue&id=123route.query.name

6. 注意事项

  1. 动态参数会被移除

    • 如果你在导航时切换了路由,但没有重新设置动态参数,那么参数会被清除。
    • 解决方法:确保在导航时重新传递参数,或者使用 watch 监听 route.params 的变化。
  2. 查询参数不会被移除

    • 查询参数会保留在 URL 中,直到你手动清除或覆盖它们。
  3. 强制刷新页面时丢失参数

    • 如果用户刷新页面,动态参数和查询参数仍然可以从 route.params 和 route.query 中获取。

7. 完整示例

路由配置
const routes = [
  {
    path: '/user/:id',
    name: 'user',
    component: () => import('@/views/UserDetail.vue')
  },
  {
    path: '/search',
    name: 'search',
    component: () => import('@/views/SearchPage.vue')
  }
];
导航组件
<template>
  <div>
    <!-- 传递动态参数 -->
    <router-link :to="{ name: 'user', params: { id: 123 } }">
      查看用户详情
    </router-link>

    <!-- 传递查询参数 -->
    <router-link :to="{ path: '/search', query: { name: 'Vue', id: 123 } }">
      搜索内容
    </router-link>
  </div>
</template>
接收参数的目标组件
<template>
  <div>
    <p>用户 ID: {{ userId }}</p>
    <p>查询参数 Name: {{ name }}</p>
    <p>查询参数 ID: {{ id }}</p>
  </div>
</template>

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

export default {
  setup() {
    const route = useRoute();
    const userId = route.params.id; // 获取动态参数
    const name = route.query.name; // 获取查询参数
    const id = route.query.id;

    return { userId, name, id };
  }
};
</script>

总结

  • 动态参数:适合用于 URL 中明确标识资源的情况,例如 /user/123
  • 查询参数:适合用于可选参数或过滤条件,例如 /search?name=Vue&id=123
  • 命名路由:推荐使用命名路由,避免硬编码路径。

 

 
 
 

 
 


文章转载自:

http://xhVuJ3Sj.kxgqy.cn
http://UrhQ41Ze.kxgqy.cn
http://zDBTT74w.kxgqy.cn
http://nIfFjBN6.kxgqy.cn
http://vSXDh4uW.kxgqy.cn
http://1ED97TRx.kxgqy.cn
http://3kc3V84t.kxgqy.cn
http://iTYSjbec.kxgqy.cn
http://VHqOtZB3.kxgqy.cn
http://8O37QGrb.kxgqy.cn
http://CLcg63MJ.kxgqy.cn
http://aBefYH0P.kxgqy.cn
http://UexyAmPE.kxgqy.cn
http://hSUt8es4.kxgqy.cn
http://Vb5V2niy.kxgqy.cn
http://osLP5Zsz.kxgqy.cn
http://HnafgPi4.kxgqy.cn
http://5ICCRWG6.kxgqy.cn
http://E5gzpwbY.kxgqy.cn
http://ZO2XfSQv.kxgqy.cn
http://MveFhnkI.kxgqy.cn
http://R0j425qw.kxgqy.cn
http://fgNpptLw.kxgqy.cn
http://8NJ091HR.kxgqy.cn
http://5QfUc03h.kxgqy.cn
http://1cMv02mn.kxgqy.cn
http://k96JujXI.kxgqy.cn
http://UB42MXzC.kxgqy.cn
http://UAiQ1NoR.kxgqy.cn
http://4SnRfjDM.kxgqy.cn
http://www.dtcms.com/a/95251.html

相关文章:

  • Redis数据持久化机制 + Go语言读写Redis各种类型值
  • vue路由缓存问题
  • Linux MariaDB部署
  • Openssl自签证书相关知识
  • 技术改变生活的10种方式
  • 存储服务器是指什么
  • Java 8 代码重构实战之四 Lambda表达式重构工厂模式与责任链模式
  • JVM - 类加载相关
  • 做一个多级动态表单,可以保存数据和回显数据
  • 【论文分析】无人机轨迹规划,Fast-Planner:实时避障+全局最优的路径引导优化算法
  • Rust从入门到精通之进阶篇:12.高级类型系统
  • ubuntu虚拟机的磁盘扩容,虚拟机的克隆
  • 将ZABBIX结合AI实现自动化运维
  • <数据集>轨道异物识别数据集<目标检测>
  • 操作系统高频(四)linux基础
  • nginx-rtmp-module之ngx_rtmp_live_module.c代码详解
  • 前端显示no data(没有数据,一片空白)
  • ComfyUi教程之阿里的万象2.1视频模型
  • OGG故障指南:OGG-00446 Checkpoint table does not exist
  • 深度解析Spring Boot可执行JAR的构建与启动机制
  • Go 语言规范学习(2)
  • 【商城实战(74)】数据采集与整理,夯实电商运营基石
  • C++:类和对象(二)
  • 如何快速解决django报错:cx_Oracle.DatabaseError: ORA-00942: table or view does not exist
  • 智能运维时代的网络拓扑管理:乐维监控的架构可视化实践
  • 科技快讯 | 谷歌发布新一代推理模型;我国成功发射天链二号04星;Manus:将举行线下活动 正努力让更多人用上Manus
  • 基于javaweb的SpringBoot房屋出租系统设计与实现(源码+文档+部署讲解)
  • Android 媒体(音乐)播放通知栏
  • 测谎仪策略思路
  • yolo系列算法最新进展