从0-1搭建一个web项目(页面布局详解)详解

本章分析页面布局详解详解

ObJack-Admin一款基于 Vue3.3、TypeScript、Vite3、Pinia、Element-Plus 开源的后台管理框架。在一定程度上节省您的开发效率。另外本项目还封装了一些常用组件、hooks、指令、动态路由、按钮级别权限控制等功能。感兴趣的小伙伴可以访问源码点个赞 地址

在这里插入图片描述
所有的动态路由都添加在了layout组件下,所以直接打开layout查看,路径为 layouts/index.vue

此处逻辑很简单就不细说了,就是通过 component 动态加载组件下边的四种布局结构。

const LayoutComponents: Record<LayoutType, Component> = {vertical: LayoutVertical,classic: LayoutClassic,transverse: LayoutTransverse,columns: LayoutColumns
};

大家可以发现,默认加载的是 vertical: LayoutVertical 组件,所以我们打开这个文件查看一下。

基本布局就是下边这样的

<el-container class="layout"><el-aside>logo和菜单</el-aside><el-container>头部、主体内容、底部</el-container>
</el-container>
  1. 菜单分析
<el-menu:router="false":default-active="activeMenu":collapse="isCollapse":unique-opened="accordion":collapse-transition="false"><SubMenu :menu-list="menuList" />
</el-menu>

首先看一下 menuList 怎么来的。

const menuList = computed(() => authStore.showMenuListGet);

通过这句代码可以发现是通过 pinia 获取来的。

接着查找,找到 auth.ts 文件,路径为 stores/modules/auth.ts

// 菜单权限列表 ==> 左侧菜单栏渲染,需要剔除 isHide == trueshowMenuListGet: state => getShowMenuList(state.authMenuList),

可以看到是通过 getShowMenuList 方法返回来的。

分析 getShowMenuList 方法之前我们先看一下 authMenuList 是怎么来的。

async getAuthMenuList() {const { data } = await getAuthMenuListApi();this.authMenuList = data;},

加载动态路由的时候已经调用了此方法,在 dynamicRouter 文件中。

await authStore.getAuthMenuList();

接着找到 getAuthMenuListApi 方法

export const getAuthMenuListApi = () => {// return http.get<Menu.MenuOptions[]>(PORT1 + `/menu/list`, {}, { loading: false });// 如果想让菜单变为本地数据,注释上一行代码,并引入本地 authMenuList.json 数据return authMenuList;
};

这就是authMenuList的封装

好了,接下来咱们分析一下 getShowMenuList 方法。

export function getShowMenuList(menuList: Menu.MenuOptions[]) {let newMenuList: Menu.MenuOptions[] = JSON.parse(JSON.stringify(menuList));return newMenuList.filter(item => {item.children?.length && (item.children = getShowMenuList(item.children));return !item.meta?.isHide;});
}

首先把 menuList 深拷贝 赋值给 newMenuList。(如果大家不懂何为深拷贝的话,可以自行去查找相关资料)

接下来就是递归调用此方法,过滤掉到 isHide=true 的数据, 因为 isHide 为 true 的话代表隐藏菜单,不需要展示。

想了想,担心有的同学看不懂递归的这一部分逻辑,还是展开说说吧。

    1. 调用数组filter方法遍历筛选对应的数组。
    1. item.children?.length 此处的?写法就是判断children是否存在,存在的话就取length,不存在的话就不往下走了,下边的 item.meta?.isHide 也如此。
    1. item.children = getShowMenuList(item.children) 这段代码的意思就是将 getShowMenuList 方法的结果赋值给item.children,那getShowMenuList的返回结果是什么呢?其实就是每次循环 isHide 不为 true 的数据。
      接下来就分析菜单是怎么渲染上去的,查看 SubMenu 文件,路径在 /layouts/components/Menu/SubMenu.vue
<template v-for="subItem in menuList" :key="subItem.path"><el-sub-menu v-if="subItem.children?.length" :index="subItem.path"><template #title><el-icon v-if="subItem.meta.icon"><component :is="subItem.meta.icon"></component></el-icon><span class="sle">{{ subItem.meta.title }}</span></template><SubMenu :menu-list="subItem.children" /></el-sub-menu><el-menu-item v-else :index="subItem.path" @click="handleClickMenu(subItem)"><el-icon v-if="subItem.meta.icon"><component :is="subItem.meta.icon"></component></el-icon><template #title><span class="sle">{{ subItem.meta.title }}</span></template></el-menu-item></template>

其实这一部门逻辑也很简单,主要是循环判断有没有children 子目录,有的话就调用 el-sub-menu 组件,没有的话就调用 el-menu-item 组件,其中值得一说的是 下边这一段代码。

<component :is="subItem.meta.icon"></component>

大家应该还记得在 main.js 中 通过循环创建了 icon 公共组件,这里就是加载对应的icon组件。

至此,动态菜单就完成了。

2. 头部
这一部分逻辑也简单,大家有不懂得可以私信。

说一下面包屑是怎么渲染的吧,重点说一下下面这部分。

const breadcrumbList = computed(() => {let breadcrumbData = authStore.breadcrumbListGet[route.matched[route.matched.length - 1].path] ?? [];// 🙅‍♀️不需要首页面包屑可删除以下判断if (breadcrumbData[0].path !== HOME_URL) {breadcrumbData = [{ path: HOME_URL, meta: { icon: "HomeFilled", title: "首页" } }, ...breadcrumbData];}return breadcrumbData;
});
    1. 每次从 authStore.breadcrumbListGet 中获取当前路由的最后一个path 作为 key 的面包屑数据
    1. ?? 是 空值合并运算符 ,意思就是如果 ?? 左侧的结果是null或者undefined 的话,就取 ?? 右侧的数据,上边代码就是如果从 authStore.breadcrumbListGet 获取不到对应数据的话,那么本次就是空数据。
    1. 接下来就是给 breadcrumbData 添加了一条首页的面包屑,使用的三点运算符。

在这里插入图片描述
如碰到其他的问题 可以私下我 一起探讨学习
如果对你有所帮助还请 点赞 收藏谢谢~!
关注收藏博客 作者会持续更新…

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

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

相关文章

【系统架构设计师】九、软件工程(软件开发生命周期|McCabe度量法|系统转换|系统维护|净室软件工程|基于构件的软件工程)

目录 九、软件开发生命周期和工具 十、McCabe度量法 十一、系统转换 11.1 遗留系统 11.2 系统转换 11.3 系统维护 十二、净室软件工程 十三、基于构件的软件工程 13.1 构件特征 13.2 构件模型要素 13.3 CBSE过程 13.4 构件组装 相关推荐 历年真题练习 九、软件开…

DOM 基本操作 - 事件基础

theme: smartblue 一、事件概述 JavaScript使我们有能力创建动态页面&#xff0c;而事件是可以被JavaScript侦测到的行为。 简单理解: 触发---响应机制。 网页中的每个元素都可以产生某些可以触发JavaScript的事件&#xff0c;例如&#xff0c;我们可以在用户点击某按钮时产生一…

libvirt qemu添加新类型磁盘格式

目录 前言 1 qemu部分 1.1 磁盘格式驱动创建 1.2 json文件创建数据结构对象&#xff1a; 2 libvirt部分&#xff1a; 2.1 对应关系设置 2.2参设向指令格式转换 前言 qemu中有很多虚拟机磁盘格式&#xff0c;比如较为熟悉的qcow2&#xff0c;luks&#xff0c;r…

C语言文件操作技术详解

C语言提供了一套强大的文件操作API&#xff0c;允许开发者进行文件读写、访问和管理。本文将深入探讨C语言文件操作的背后的技术&#xff0c;包括基本文件操作、文件读写以及文件权限和属性。我们将通过详细的解释和实用的代码案例来展示如何有效地使用这些技术。 第一部分&am…

C++ //练习 14.52 在下面的加法表达式中分别选用了哪个operator+?列出候选函数、可行函数及为每个可行函数的实参执行的类型转换:

C Primer&#xff08;第5版&#xff09; 练习 14.52 练习 14.52 在下面的加法表达式中分别选用了哪个operator&#xff1f;列出候选函数、可行函数及为每个可行函数的实参执行的类型转换&#xff1a; struct LongDouble{//用于演示的成员opeartor&#xff1b;在通常情况下是个…

自动驾驶技术的原理

自动驾驶汽车利用视觉识别功能来感知周围环境并做出驾驶决策。以下是自动驾驶汽车如何利用视觉识别功能及其原理的详细说明&#xff1a; ### 视觉识别在自动驾驶中的应用 1. **目标检测&#xff08;Object Detection&#xff09;**&#xff1a;识别并定位道路上的其他车辆、行人…

【安全设备】EDR

一、什么是EDR EDR即集检测、防御、运维功能于一体的主机安全及管理系统。EDR是一款集成了丰富的系统加固与防护、网络加固与防护等功能的主机安全产品。 二、EDR的部署模式 EDR&#xff08;Endpoint Detection and Response&#xff0c;端点检测和响应&#xff09;的部署方…

开源项目编译harbor arm架构的包 —— 筑梦之路

GitHub - amy5200/harbor-arm64 先做个记录&#xff0c;空了再验证

矩阵分解及其在机器学习中的应用

阵分解是一种广泛应用于数据挖掘和机器学习领域的技术&#xff0c;它通过将一个高维数据集分解为多个低维的数据集&#xff0c;以降低数据的复杂性、提高计算效率&#xff0c;并发现数据中的隐含结构。本文将详细介绍矩阵分解的基本概念、主要方法及其在机器学习中的应用。 一、…

JWT总结

JWT&#xff08;JSON Web Tokens&#xff09;是一种用于在双方之间安全传输信息的简洁的、URL安全的令牌标准。以下是关于JWT的结构、作用、优点以及可能出现的问题的详细解答&#xff1a; 一、JWT的结构 JWT的结构由三个部分组成&#xff0c;它们通过.&#xff08;点&#x…

fastadmin框架后台列表固定第一行列表固定头部

在列表中&#xff0c;如果列表字段很多&#xff0c;并且每页数量很多&#xff0c;往下拉的时候就不好辨别数据是哪个字段的&#xff0c;对用户造成不好的浏览体验。 通过以下方法&#xff0c;可以实现将列表的第一行&#xff0c;也就是头部&#xff0c;固定在第一行显示&#…

TLS与SSL的区别

目录 一、协议版本二、安全性三、性能四、兼容性五、总结 TLS&#xff08;Transport Layer Security&#xff09;和SSL&#xff08;Secure Sockets Layer&#xff09;都是为了保障互联网通信安全而设计的协议&#xff0c;主要用于加密客户端与服务器之间的数据传输。尽管它们的…

14-62 剑和诗人36 - 混合专家 (MoE) 扩展 AI 视野

了解混合专家 (MoE) 混合专家 (MoE) 是一种机器学习技术&#xff0c;它将多个“专家”神经网络模型组合成一个更大的模型。MoE 的目标是通过组合专业专家&#xff08;每个专家专注于不同的子领域&#xff09;来提高 AI 系统的准确性和能力。 MoE 模型的一些关键特征&#xff1…

探索Kotlin:从K1到K2

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 嘿&#xff0c;小伙伴们&#xff01;今天我们来聊聊Kotlin&#xff0c;这个在安卓开发圈里越来越火的编程语言。…

苹果手机抹机(马来西亚)操作步骤

苹果手机抹机&#xff08;马来西亚&#xff09;操作步骤 操作环境操作步骤 操作环境 苹果6s&#xff0c;没有插卡&#xff0c;就连接上了一个wifi 操作步骤

XML Schema 杂项数据类型

XML Schema 杂项数据类型 XML Schema 提供了多种数据类型,用于定义 XML 文档中元素和属性的结构和内容。除了常见的简单类型(如字符串、整数、日期等)和复杂类型(如元素和属性的组合)之外,XML Schema 还包括一些杂项数据类型,用于处理特定的数据格式和验证需求。本文将…

错位情缘悬疑升级

✨&#x1f525;【错位情缘&#xff0c;悬疑升级&#xff01;关芝芝与黄牡丹的惊世婚约】&#x1f525;✨在这个迷雾重重的剧场&#xff0c;一场前所未有的错位大戏正悄然上演&#xff01;&#x1f440; 你没看错&#xff0c;昔日兄弟的前女友关芝芝&#xff0c;竟摇身一变成了…

Unity-Invoke带参数的代码一个

Unity的分帧加载,其实没多难,只要理解了原理 而Unity的延迟有两种写法, 一是, StartCoroutinue 二是, Invoke() 我记得之前,有一种Action Delay的写法(找到在补上) 三现在更多的应该是, async task 等 其实原理都是一样的(虽然底层逻辑不一样,完全不一样,但…

API 类别 - 选择器

API 类别 - 选择器 选择器 API 是一种常用的接口,它允许开发人员通过特定的标准从一组数据中选择特定的项目。这类 API 广泛应用于各种编程场景,特别是在需要从大量数据中快速准确地提取信息时。本文将探讨选择器 API 的概念、应用场景、工作原理以及如何在实际项目中有效使…

FastAPI 学习之路(三十七)元数据和文档 URL

实现前的效果 那么如何实现呢&#xff0c;第一种方式如下&#xff1a; from routers.items import item_router from routers.users import user_router""" 自定义FastApi应用中的元数据配置Title&#xff1a;在 OpenAPI 和自动 API 文档用户界面中作为 API 的…