【layout组件 与 路由镶嵌】vue3 后台管理系统

news2025/7/20 2:54:29

前言

很多同学在第一次搭建后台管理系统时,会遇到一个问题,layout组件该放哪里?如何使用?路由又该如何设计?
这边会讲一下我的思考过程和最后的结果,大家可以参考一下,希望大家看完能有所收获。

文章目录

  • 前言
    • 一、为什么需要layout组件?
      • 1. Container 布局容器​
      • 2. Header 顶栏容器
        • 1) 页头组件`<el-page-header>`
        • 2)自己写的组件
        • 3)`<el-aside>`侧边栏容器
        • 4) `<el-main>`主要区域容器。
        • 5)`<el-footer>`底栏容器。
    • 二、怎么写一个layout组件?
    • 三、怎么使用layout组件呢?
      • 1. 先在路由配置里定义基础路由,同时设置children路由。
      • 2.动态 Layout 组件(基于路由元信息)
        • 1)路由配置:在路由中添加meta.layout字段指定布局组件。
        • 2)创建 Layout 组件:准备多个 Layout 组件(如AdminLayout.vue、AuthLayout.vue)。
        • 3)动态渲染 Layout:在根组件中根据当前路由的meta.layout动态加载布局。
      • 3.组合式 API + 插件方式
        • 1)创建 Layout 插件:注册全局组件并处理布局逻辑。
        • 2)定义 Layout 组件:使用插槽机制实现灵活布局。
        • 3)在路由中使用:通过插件提供的组件包裹视图
      • 4. 更多&总结

一、为什么需要layout组件?

1. Container 布局容器​

我用的是 element-plus 的组件,所以这里以这个ui库作为例子讲哦。

这里先引入一个组件,<contaienr>用于布局的容器组件,方便快速搭建页面的基本结构。

  • <el-container>:外层容器。 当子元素中包含 <el-header><el-footer> 时,全部子元素会垂直上下排列, 否则会水平左右排列。
    常见且实用的布局呢,大概是一下这几个:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2. Header 顶栏容器

<el-header>:顶栏容器。一般会单独写个组件,组件内部大概是以下这些部分:

1) 页头组件<el-page-header>

在组件中可以展示很多区块,大家可以自行去了解哈。如果不清楚自己要怎么设计,就直接用这个组件就好啦!在这个组件里放东西就ok~(这是链接)。

2)自己写的组件
  • 控制侧边栏收缩和展开的icon,可以用<el-icon><Fold /></el-icon> ,记得添加相对应的事件。
  • 面包屑组件,用来展示当前 <Main>中正在展示的路由路径。可以用
    el-breadcrumb组件
    在这里插入图片描述
3)<el-aside>侧边栏容器

可以使用<el-menu>菜单组件,这边一般是通过循环 menu数组(大型项目都会涉及到权限配置,里面就会有一个菜单栏配置,这边就是动态加载的啦)。有同学不会我再放代码吧。
在这里插入图片描述

4) <el-main>主要区域容器。

上面说啦~展示我们的路由们

5)<el-footer>底栏容器。

一般写个备案的时间呀、公司邮箱呀、公司信息呀什么的。聪明的你!灵活使用吧!

二、怎么写一个layout组件?

好啦,几个要素都了解了,接下来需要我们的脑子和手配合。将它们组成一个完整的layout组件。我分享一下简单的layout组件在项目中的结构长啥样哈,如图:
在这里插入图片描述
这里放一下index.vue的代码

<template>
<div class="common-layout">
  <el-container>
    <el-aside><MyAside /></el-aside>
    <el-container>
      <el-header class="header"><MyHeader /></el-header>
      <el-main>
        <!-- 这里是会被缓存的视图组件 -->
        <router-view v-slot="{ Component }">
          <keep-alive>
            <component :is="Component" :key="$route.name" v-if="$route.meta.keepAlive" />
          </keep-alive>
          <component :is="Component" :key="$route.name" v-if="!$route.meta.keepAlive" />
        </router-view>
      </el-main>
    </el-container>
  </el-container>
</div>
</template>

三、怎么使用layout组件呢?

这里有点小可爱不知道咋用@,请转到我的另一篇文章:
【vite好用的配置】自动导入组件、vue中的hook、路径解析、打包配置、本地运行反向代理配置

1. 先在路由配置里定义基础路由,同时设置children路由。

// router/index.js
import { createRouter, createWebHistory } from 'vue-router'
const routes = [
  {
    path: '/',
    name: 'Layout',
    component: () => import('@/layout/index.vue'),
    children: [
      {
        path: '',
        name: 'Dashboard',
        component: () => import('@/views/Dashboard.vue')
      },
      {
        path: '/users',
        name: 'Users',
        component: () => import('@/views/Users.vue')
      }
    ]
  },
  {
    path: '/login',
    name: 'Login',
    component: () => import('@/views/Login.vue')
  }
]

const router = createRouter({
  history: createWebHistory(),
  routes
})

export default router

2.动态 Layout 组件(基于路由元信息)

通过路由配置中的meta字段指定使用的 Layout 组件,实现更灵活的布局切换。实现步骤:

1)路由配置:在路由中添加meta.layout字段指定布局组件。
// router/index.js
const routes = [
  {
    path: '/',
    name: 'Dashboard',
    component: () => import('@/views/Dashboard.vue'),
    meta: { layout: 'AdminLayout' }
  },
  {
    path: '/login',
    name: 'Login',
    component: () => import('@/views/Login.vue'),
    meta: { layout: 'AuthLayout' }
  }
]
2)创建 Layout 组件:准备多个 Layout 组件(如AdminLayout.vue、AuthLayout.vue)。
3)动态渲染 Layout:在根组件中根据当前路由的meta.layout动态加载布局。
<!-- App.vue -->
<template>
  <component :is="currentLayout">
    <router-view />
  </component>
</template>

<script>
import { computed, onMounted, ref } from 'vue'
import { useRouter } from 'vue-router'

export default {
  setup() {
    const router = useRouter()
    const layouts = {
      AdminLayout: () => import('@/layouts/AdminLayout.vue'),
      AuthLayout: () => import('@/layouts/AuthLayout.vue'),
      DefaultLayout: () => import('@/layouts/DefaultLayout.vue')
    }

    const currentLayout = computed(() => {
      const layout = router.currentRoute.value.meta.layout || 'DefaultLayout'
      return layouts[layout]
    })

    return {
      currentLayout
    }
  }
}
</script>

优点:
更灵活的布局切换,同一层级路由可使用不同 Layout。
避免深层嵌套路由,路由配置更简洁。
缺点:
需要在每个路由中手动指定 layout,维护成本较高。

3.组合式 API + 插件方式

通过创建自定义插件,将 Layout 逻辑封装,减少重复代码。实现步骤:

1)创建 Layout 插件:注册全局组件并处理布局逻辑。
// plugins/layout.js
import AdminLayout from '@/layouts/AdminLayout.vue'
import AuthLayout from '@/layouts/AuthLayout.vue'

export default {
  install(app) {
    app.component('AdminLayout', AdminLayout)
    app.component('AuthLayout', AuthLayout)
  }
}
2)定义 Layout 组件:使用插槽机制实现灵活布局。
3)在路由中使用:通过插件提供的组件包裹视图
<!-- 路由组件示例 -->
<template>
  <AdminLayout>
    <template #header>
      <h1>Custom Header</h1>
    </template>
    <template #content>
      <router-view />
    </template>
    <template #footer>
      <p>Custom Footer</p>
    </template>
  </AdminLayout>
</template>

优点:
高度可定制,通过插槽传递内容更灵活。
布局逻辑集中管理,便于维护。
缺点:
需要额外的插件配置,适合大型项目。

4. 更多&总结

当然还有其他办法啦,这里就差不多列举出来,不仔细说了哈,感兴趣的同学,可以自己去研究一下。

  • 基础嵌套路由:适合中小型项目,布局结构固定。
  • 动态 Layout:适合需要灵活切换布局的场景。
  • 插件方式:适合大型项目,需要统一管理布局逻辑。
  • 权限布局:适合需要根据用户角色展示不同布局的系统。
  • 多层嵌套 Layout:适合超复杂系统(如 IDE、设计工具等)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2374927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mobile自动化测试-appium webdriverio

WebdriverIO是一款支持mobile app和mobile web自动化测试框架&#xff0c;与appium集成&#xff0c;完成对mobile应用测试。支持ios 和android两种平台&#xff0c;且功能丰富&#xff0c;是mobile app自动化测试首选框架。且官方还提供了mobile 应用测试example代码&#xff0…

Spring Bean有哪几种配置方式?

大家好&#xff0c;我是锋哥。今天分享关于【Spring Bean有哪几种配置方式&#xff1f;】面试题。希望对大家有帮助&#xff1b; Spring Bean有哪几种配置方式&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring Bean的配置方式主要有三种&#xff…

解析小米大模型MiMo:解锁语言模型推理潜力

一、基本介绍 1.1 项目背景 在大型语言模型快速发展的背景下,小米AI团队推出MiMo系列模型,突破性地在7B参数规模上实现卓越推理能力。传统观点认为32B以上模型才能胜任复杂推理任务,而MiMo通过创新的训练范式证明:精心设计的预训练和强化学习策略,可使小模型迸发巨大推理…

证券行业数字化转型:灵雀云架设云原生“数字高速路”

01 传统架构难承重负&#xff0c;云原生破局成必然 截至2024年&#xff0c;证券行业总资产突破35万亿元&#xff0c;线上交易占比达85%&#xff0c;高频交易、智能投顾等业务对算力与响应速度提出极限要求。然而&#xff0c;以虚拟化为主导的传统IT架构面临四大核心瓶颈&#…

Centos系统详解架构详解

CentOS 全面详解 一、CentOS 概述 CentOS&#xff08;Community Enterprise Operating System&#xff09; 是基于 Red Hat Enterprise Linux&#xff08;RHEL&#xff09; 源代码构建的免费开源操作系统&#xff0c;专注于稳定性、安全性和长期支持&#xff0c;广泛应用于服…

【后端】SpringBoot用CORS解决无法跨域访问的问题

SpringBoot用CORS解决无法跨域访问的问题 一、跨域问题 跨域问题指的是不同站点之间&#xff0c;使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制&#xff0c;它的初衷是为了保证用户的安全&#xff0c;防止恶意网站窃取数据。但这个保护机制也带来了新的…

MySQL 8.0(主从复制)

MySQL 8.0 的 主从复制&#xff08;Master-Slave Replication&#xff09; 是一种数据库高可用和数据备份的核心技术&#xff0c;下面用 一、什么是主从复制&#xff1f; 就像公司的「领导-秘书」分工&#xff1a; 主库&#xff08;Master&#xff09;&#xff1a;负责处理所…

TCPIP详解 卷1协议 十 用户数据报协议和IP分片

10.1——用户数据报协议和 IP 分片 UDP是一种保留消息边界的简单的面向数据报的传输层协议。它不提供差错纠正、队列管理、重复消除、流量控制和拥塞控制。它提供差错检测&#xff0c;包含我们在传输层中碰到的第一个真实的端到端&#xff08;end-to-end&#xff09;校验和。这…

finebi使用资源迁移无法导入资源,解决方法

finebi使用资源迁移无法导入资源&#xff0c;解决方法 最近在使用finebi开发finebi报表&#xff0c;报表开发之后&#xff0c;从一台电脑将资源导入另一台电脑后&#xff0c;出现不允许导入的提示&#xff0c;如下&#xff1a; 原因&#xff1a; 两个finebi的管理员名称不一致…

分布式锁redisson的中断操作

1、先贴代码 RequestMapping(value "/update", method RequestMethod.POST)ResponseBodypublic Result update(RequestBody Employee employee) { // 修改数据库&#xff08;存在线程不安全 需要使用redison设置分布式锁 防止被修改&#xff09; // 设…

Docker:安装配置教程(最新版本)

文章目录 一、前言二、具体操作2.1 卸载 Docker (可选)2.2 重新安装&#xff08;使用清华大学镜像&#xff09;2.3 配置轩辕镜像加速2.4 Docker 基本命名2.5 测试是否成功 三、结语 一、前言 Docker 是一种容器化技术&#xff0c;在软件开发和部署中得到广泛的应用&#xff0c…

neo4j官方示例

目录 一、准备数据 1.执行查看结果 二、操作 1.find 单个节点 2.同上&#xff0c;已某个属性去查询 3. 指定查询个数 4.条件查询 5.查询某个人出演的电影汇总 6.查询tom出演的电影中&#xff0c;还有其他演员的信息。 7.查询跟电影(Cloud Atlas)有关的演员&#xff0…

前端自学入门:HTML 基础详解与学习路线指引

在互联网的浪潮中&#xff0c;前端开发如同构建数字世界的基石&#xff0c;而 HTML 则是前端开发的 “入场券”。对于许多渴望踏入前端领域的初学者而言&#xff0c;HTML 入门是首要挑战。本指南将以清晰易懂的方式&#xff0c;带大家深入了解 HTML 基础&#xff0c;并梳理前端…

vue实现与后台springboot传递数据【传值/取值 Axios 】

vue实现与后台springboot传递数据【传值/取值】 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性。【帮帮志系列文章】&#xff1a;每…

【英语笔记(三)】介绍谓语动词的分类,初步讲解四种基本状态:一般、进行、完成、完成进行

1. 五大类谓语动词 2. 谓语动词分类 3. 动词时间 过去--------------------------现在-----------------------未来 3. 动词状态 3.1 进行状态 3.2 完成状态 3.3 完成进行状态 3.4 一般状态 4. 时间 状态 名称说明例句现在现在现在现在进行时态现在某物正在做什么事情一只…

【Python】让Selenium 像Beautifulsoup一样,用解析HTML 结构的方式提取元素!

我在使用selenium的find_element的方式去获取网页元素&#xff0c;一般通过xpath、css_selector、class_name的方式去获取元素的绝对位置。 但是有时候如果网页多了一些弹窗或者啥之类的&#xff0c;绝对位置会发生变化&#xff0c;使用xpath等方法&#xff0c;需要经常变动。…

2025 后端自学UNIAPP【项目实战:旅游项目】3、API接口请求封装,封装后的简单测试以及实际使用

一、创建请求封装目录 选中自己的项目&#xff0c;右键鼠标---->新建---->目录---->名字自定义【我的是api】 二、创建两个js封装文件 选中封装的目录&#xff0c;右键鼠标---->新建---->js文件---->名字自定义【我的两个js文件分别是my_http和my_api】 三…

Ascend的aclgraph(二)_npu_backend中还有些什么秘密?

1 _npu_backend 文章还是从代码开始 import torch_npu, torchair config torchair.CompilerConfig() # 设置图下沉执行模式 config.mode "reduce-overhead" npu_backend torchair.get_npu_backend(compiler_configconfig) opt_model torch.compile(model, back…

ventoy安全启动怎么选_ventoy安全启动支持是开还是关

ventoy安全启动怎么选&#xff1f;Ventoy新一代多系统启动U盘解决方案。国产开源U盘启动制作工具&#xff0c;支持Legacy BIOS和UEFI模式&#xff0c;理论上几乎支持任何ISO镜像文件&#xff0c;支持加载多个不同类型的ISO文件启动&#xff0c;无需反复地格式化U盘&#xff0c;…

CC53.【C++ Cont】二分查找的普通模版

目录 1.知识回顾 2.关键点 特点 三个模版 普通的模版(有局限) 以LeetCode上的一道题为例:704. 二分查找 分析 引入二段性:分两段,舍一段,操作另一段(这个是二分查找的本质!) 代码 提交结果 当然也可以使用随机数来分两段 普通模版总结 1.知识回顾 之前在C语言专栏…