You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue Router动态路由匹配错误:Posts与Pages跳转组件不匹配如何解决?

问题根源

你当前的两个动态路由/:pageSlug和/:postSlug的路径格式完全一致,vue-router 会按照路由定义的先后顺序做匹配,排在前面的路由会优先被命中,所以才会出现两个列表都跳转到同一个组件的问题。

最优解决方案:给两类动态路由加区分前缀

这是逻辑最清晰、不易出冲突、也对SEO更友好的方案,修改步骤如下:

1. 修改路由配置(router/index.js)

把页面详情、文章详情的路由加上不同的路径前缀,替换你原来的两个动态路由配置:

const routes = [
  // 原有固定路由不变,省略...
  {
    path: '/page/:slug', // 页面详情统一加/page前缀
    name: 'Page',
    component: () => import(/* webpackChunkName: "page" */ '../components/Page/Page.vue')
  },
  {
    path: '/post/:slug', // 文章详情统一加/post前缀
    name: 'Post',
    component: () => import(/* webpackChunkName: "post" */ '../components/Post/Post.vue')
  },
]

同时简化afterEach的逻辑:

router.afterEach((to) => {
  let body = document.querySelector('body');
  // 现在两种详情路由的参数都叫slug,直接取值即可
  if (to.params.slug) {
    body.classList.add('vue--page--' + to.params.slug);
  }
});

2. 修改列表页的跳转链接

Pages.vue 里的router-link修改为:

<router-link :to="`/page/${page.slug}`" tag="div" :key="page.id">
READ MORE 
</router-link>

另外注意你原来的key属性写的是key="page.id",是静态值,要改成动态绑定:key="page.id"。

Posts.vue 里的router-link修改为:

<router-link :to="`/post/${post.slug}`" tag="div" :key="post.id">
READ MORE 
</router-link>

同时修正你Posts.vue里v-for的笔误:原来写的v-for="(post, index) in post",要改成v-for="(post, index) in posts",否则列表渲染会出错。

3. 调整详情组件的参数取值

在你的Page.vue和Post.vue中,请求对应WordPress接口时,参数从this.$route.params.pageSlug/this.$route.params.postSlug统一改为this.$route.params.slug即可。

补充说明

如果确实不想在路径上加前缀,也可以通过路由元信息、动态匹配规则做区分,但这类方案需要做额外的slug存在性校验,逻辑更复杂,还可能出现page和post slug重复的冲突,因此不推荐。


内容的提问来源于stack exchange,提问作者Meidanm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:18:04