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

Vue3如何实现多层嵌套路由?

解决Vue Router无限层级文件夹路由复用问题

不用反复添加children路由,直接用通配符路由就能匹配任意层级的文件夹路径,复用同一个folder组件,具体操作如下:

1. 修改路由配置

把原来的嵌套路由改成单条通配符路由,匹配/folders/开头的所有层级路径:

window.router = new VueRouter({
  routes: [
    // ...其他路由
    {
      path: '/folders/*', // 匹配/folders/后任意层级的子路径
      name: 'folder',
      component: require('./components/folder.vue')
    }
  ]
})

2. 获取当前文件夹路径

在folder组件里,通过$route.params['*']拿到路由匹配到的层级字符串。比如访问/folders/f1/f1-1/f1-1-1时,this.$route.params['*']的值就是f1/f1-1/f1-1-1,直接把这个字符串传给API接口即可。

3. 监听路由变化更新数据

因为同一个组件复用,路由切换时组件不会重新触发created钩子,所以需要通过以下方式处理数据更新:

方式一:使用路由守卫beforeRouteUpdate

export default {
  data() {
    return {
      folderData: null
    }
  },
  created() {
    this.loadFolderData()
  },
  // 路由更新时触发,加载新路径的文件夹数据
  beforeRouteUpdate(to, from, next) {
    this.loadFolderData()
    next()
  },
  methods: {
    loadFolderData() {
      const folderPath = this.$route.params['*'] || ''
      // 替换成你的实际API请求逻辑
      axios.get(`/api/folders?path=${folderPath}`).then(res => {
        this.folderData = res.data
      })
    }
  }
}

方式二:监听$route变化

export default {
  data() {
    return {
      folderData: null
    }
  },
  watch: {
    // 监听路由变化,immediate确保组件初始化时也执行一次
    '$route': {
      immediate: true,
      handler() {
        const folderPath = this.$route.params['*'] || ''
        axios.get(`/api/folders?path=${folderPath}`).then(res => {
          this.folderData = res.data
        })
      }
    }
  }
}

4. 生成子文件夹跳转链接

点击子文件夹时,直接拼接当前路径生成新路由:

<!-- 示例:假设subFolder是子文件夹对象 -->
<div v-for="subFolder in folderData.children" :key="subFolder.name">
  <a @click="$router.push(`/folders/${$route.params['*'] || ''}/${subFolder.name}`)">
    {{ subFolder.name }}
  </a>
</div>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:33:23