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/123 route.params.id
查询参数 (query) URL 的 ? /search?name=Vue&id=123 route.query.name

6. 注意事项

  1. 动态参数会被移除

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

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

    • 如果用户刷新页面,动态参数和查询参数仍然可以从 route.paramsroute.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
  • 命名路由:推荐使用命名路由,避免硬编码路径。
相关推荐
WebInfra5 分钟前
Rspack 1.3 发布:内存大幅优化,生态加速发展
前端·javascript·github
努力的搬砖人.7 分钟前
axios使用
vue.js
ak啊8 分钟前
Webpack 构建阶段:模块解析流程
前端·webpack·源码
学习OK呀18 分钟前
后端上手学习react基础知识
前端
星火飞码iFlyCode19 分钟前
大模型提效之服务端日常开发
前端
zoahxmy092920 分钟前
Canvas 实现单指拖动、双指拖动和双指缩放
前端·javascript
花花鱼20 分钟前
vue3 动态组件 实例的说明,及相关的代码的优化
前端·javascript·vue.js
Riesenzahn22 分钟前
CSS的伪类和伪对象有什么不同?
前端·javascript
Riesenzahn22 分钟前
请描述下null和undefined的区别是什么?这两者分别运用在什么场景?
前端·javascript
代码小学僧22 分钟前
一行代码顶二十行代码! 🔧 修复 React 聊天室滚动加载问题 Bugfix 解决方法分享
前端·css·react.js