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

Nuxt3根目录pages下如何配置嵌套子路由?

Nuxt3 根目录嵌套子路由实现方案

你的问题核心是根页面(index.vue)作为父路由承载子路由,但当前文件结构不符合Nuxt3的路由约定,导致<NuxtPage>无法正确匹配子组件。

正确的文件结构调整

Nuxt3的pages目录路由约定中,要让index.vue成为父路由,需要将子组件放在与index.vue同级的同名文件夹内:

pages/
├── index.vue       # 父组件(根路由页面)
├── index/          # 与父组件同名的文件夹,存放子路由
│   ├── one.vue     # 子路由 /one
│   ├── two.vue     # 子路由 /two
│   └── three.vue   # 子路由 /three

或者保持子组件的index.vue结构:

pages/
├── index.vue
├── index/
│   ├── one/
│   │   └── index.vue
│   ├── two/
│   │   └── index.vue
│   └── three/
│       └── index.vue

父组件(index.vue)修改

确保父组件内的导航链接正确指向子路由,并且<NuxtPage>存在:

<template>
  <div>
    <nav>
      <label>
        <input type="radio" name="tab" value="/one" v-model="activeTab" />
        页面一
      </label>
      <label>
        <input type="radio" name="tab" value="/two" v-model="activeTab" />
        页面二
      </label>
      <label>
        <input type="radio" name="tab" value="/three" v-model="activeTab" />
        页面三
      </label>
    </nav>
    <!-- 子路由出口 -->
    <NuxtPage />
  </div>
</template>

<script setup>
const activeTab = ref('/one')
// 监听单选框变化,跳转路由
watch(activeTab, (newVal) => {
  navigateTo(newVal)
})
// 初始化路由
onMounted(() => {
  activeTab.value = useRoute().path
})
</script>

为什么原结构不生效?

原结构中pages/one/index.vue会被Nuxt解析为独立的一级路由/one,而不是/的子路由。只有当子组件放在与父路由组件同名的文件夹下时,才会被识别为该父路由的嵌套子路由。

替代方案:使用页面组件动态渲染

如果不想调整文件结构,也可以在父组件中直接动态渲染子组件,无需依赖路由系统:

<template>
  <div>
    <nav>
      <label>
        <input type="radio" name="tab" value="one" v-model="activeTab" />
        页面一
      </label>
      <!-- 其他单选框 -->
    </nav>
    <component :is="activeTabComponent" />
  </div>
</template>

<script setup>
const activeTab = ref('one')
const activeTabComponent = computed(() => {
  return () => import(`./${activeTab.value}/index.vue`)
})
</script>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:50:24