Vue3嵌套路由

Vue3嵌套路由

什么是嵌套路由?

嵌套路由是Vue Router中的一个重要概念,它允许在路由组件内部嵌套其他路由组件,形成父子路由关系。这种设计特别适合构建具有多层布局结构的应用;

为什么需要嵌套路由?

一个典型的后台管理系统有这些需求:

  1. 外层有整理布局,比如头部、侧边栏;
  2. 内层有不同的功能页面,比如用户管理、订单管理、系统设置等;
  3. 每个功能页面内部可能还有子页面,比如用户列表、用户详情;

嵌套路由就是为了解决这种具有分层视图结构的要求;

实际案例

  • 我们还是使用上次的方法来进行演示,给services.vue这个组件给改造以下
js 复制代码
<template>
  <div class="services-container">
    <h2 class="content-title">服务项目</h2>
    
    <div class="services-layout">
      <!-- 左侧服务列表 -->
      <div class="services-sidebar">
        <button 
          v-for="service in services" 
          :key="service.id"
          :class="['service-btn', { active: activeService === service.id }]"
          @click="selectService(service.id)"
        >
          {{ service.name }}
        </button>
      </div>
      
      <!-- 右侧嵌套内容区域 -->
      <div class="services-content">
        <router-view></router-view>
      </div>
    </div>
  </div>
</template>

<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'

const router = useRouter()
const activeService = ref('web-design')

const services = ref([
  { id: 'web-design', name: '网站设计与开发' },
  { id: 'mobile-app', name: '移动应用开发' },
  { id: 'ecommerce', name: '电子商务解决方案' },
  { id: 'api', name: 'API 开发与集成' },
  { id: 'consulting', name: '技术咨询与培训' }
])

const selectService = (serviceId: string) => {
  activeService.value = serviceId
  router.push(`/services/${serviceId}`)
}

onMounted(() => {
  // 初始化时导航到默认服务
  if (router.currentRoute.value.path === '/services') {
    router.push('/services/web-design')
  }
})
</script>

<style scoped>
.services-container {
  padding: 20px;
  max-width: 1200px;
  margin: 0 auto;
}

.content-title {
  font-size: 24px;
  margin-bottom: 20px;
  color: #2c3e50;
  border-bottom: 2px solid #eee;
  padding-bottom: 10px;
}

.services-layout {
  display: flex;
  gap: 20px;
  min-height: 400px;
}

.services-sidebar {
  width: 250px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.service-btn {
  padding: 12px 16px;
  background: #f8f9fa;
  border: 1px solid #dee2e6;
  border-radius: 6px;
  text-align: left;
  cursor: pointer;
  transition: all 0.3s ease;
  font-size: 14px;
}

.service-btn:hover {
  background: #e9ecef;
  border-color: #adb5bd;
}

.service-btn.active {
  background: #007bff;
  color: white;
  border-color: #007bff;
}

.services-content {
  flex: 1;
  border: 1px solid #dee2e6;
  border-radius: 6px;
  padding: 20px;
  background: white;
}
</style>
  • 之后我们创建一个组件,其他的不创建了,演示一下就行
js 复制代码
<template>
    <div class="service-detail">
        <h3>网站设计与开发</h3>
        <p>我们提供全方位的网站设计与开发服务,从概念设计到最终部署,确保您的网站在各种设备上都能完美展示。</p>

        <div class="service-features">
            <h4>服务特点:</h4>
            <ul>
                <li>响应式设计,适配各种屏幕尺寸</li>
                <li>现代化UI/UX设计</li>
                <li>SEO优化,提高搜索引擎排名</li>
                <li>快速加载速度优化</li>
                <li>内容管理系统集成</li>
            </ul>
        </div>
    </div>
</template>

<script setup lang="ts">
// 组件逻辑
</script>

<style scoped>
.service-detail h3 {
    color: #2c3e50;
    margin-bottom: 15px;
}

.service-detail p {
    margin-bottom: 15px;
    line-height: 1.6;
}

.service-features {
    margin-top: 20px;
}

.service-features h4 {
    margin-bottom: 10px;
    color: #495057;
}

.service-features ul {
    padding-left: 20px;
}

.service-features li {
    margin-bottom: 8px;
}
</style>
  • 然后就需要我们在路由上进行定义一下
js 复制代码
{
        path: '/services',
        component: Services,
        name: 'services',
        children: [
            {
                path: 'web-design',
                component: WebDesign
            }
        ]
    }

注:

  1. 嵌套路由配置需要在父路由定义children数组,切记子路由不需要加/;

  2. 路由视图需要在父组件中使用展示嵌套内容;

  3. useRouter是进行路由跳转的,后面会详细讲到;

相关推荐
牧码岛1 小时前
Web前端之Vue+Element打印时输入值没有及时更新dom的问题
前端·javascript·html·web·web前端
小二李1 小时前
第8章 Node框架实战篇 - 文件上传与管理
前端·javascript·数据库
HIT_Weston1 小时前
45、【Ubuntu】【Gitlab】拉出内网 Web 服务:http.server 分析(二)
前端·http·gitlab
十一.3662 小时前
79-82 call和apply,arguments,Date对象,Math
开发语言·前端·javascript
霍格沃兹测试开发学社-小明2 小时前
测试左移2.0:在开发周期前端筑起质量防线
前端·javascript·网络·人工智能·测试工具·easyui
n***F8752 小时前
Vue项目中 安装及使用Sass(scss)
vue.js·sass·scss
用户99045017780092 小时前
若依工作流-包含网关
前端
by__csdn2 小时前
Vue 中计算属性、监听属性与函数方法的区别详解
前端·javascript·vue.js·typescript·vue·css3·html5
on_pluto_2 小时前
【debug】关于如何让电脑里面的两个cuda共存
linux·服务器·前端