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

news2024/11/15 5:36:16

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

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 == true
    showMenuListGet: 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.coloradmin.cn/o/1914812.html

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

相关文章

10个图源二维码分享及使用方法

我们曾在《8个图源二维码分享及使用方法》一文中&#xff0c;为你分享了8个图源二维码。 现在在此基础之上新增两个图源二维码&#xff0c;共享10个。 如果你需要这些图源&#xff0c;请在文末查看领取方式。 新增了哪两个图源 增加的两个图源分别是全球10m等高线地图和全球…

【HTML入门】第八课 - 链接的学习(二)

我们上一节学习了&#xff0c;链接的基本知识&#xff0c;有锚点&#xff0c;还有鼠标上移的title属性的作用&#xff0c;这一节&#xff0c;我们继续说链接的知识点。 目录 1 跳转本项目的网页 1.1 修改html文件名 1.2 新建index1.html文件 1.3 修改index1.html文件 1.4…

随身WiFi市场乱象横生,随身WiFi测评最好的格行随身WiFi如何引领变革?

在当今随身WiFi市场乱象频发、内卷严重的背景下&#xff0c;消费者对于产品的性能与商家是否会后台割韭菜依旧存疑&#xff0c;尤其是“随身WiFi到底卡不卡&#xff1f;”的问题&#xff0c;成为了广大消费者关注的重点。然而&#xff0c;在众多品牌中&#xff0c;格行随身WiFi…

浅谈开源项目对于我编程之路的影响

开源项目有哪些机遇与挑战&#xff1f; 随着全球经济和科技环境的快速变化&#xff0c;开源软件项目的蓬勃发展成为了开发者社区的热门话题。越来越多的开发者和企业选择参与开源项目&#xff0c;以推动技术创新和实现协作共赢。你如何看待当前开源项目的发展趋势&#xff1f;…

昇思25天学习打卡营第22天 | Shufflenet图像分类

ShuffleNet图像分类 当前案例不支持在GPU设备上静态图模式运行&#xff0c;其他模式运行皆支持。 ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有…

分布式架构演进之路

文章目录 1 相关概念1.1 基本概念1.2 评价指标 2 架构演进2.1 单机架构2.2 应用数据分离架构2.3 应用服务集群架构2.4 读写分离/主从分离架构2.5 冷热分离架构&#xff08;缓存&#xff09;2.5 分库分表2.6 微服务架构 3 本章总结 1 相关概念 在正式引入架构演进之前&#xff…

不入耳耳机哪个品牌好便宜学生、不入耳式蓝牙耳机推荐

开放式耳机相较于传统的入耳式耳机&#xff0c;极大地提升了用户的听觉享受和佩戴时的持久舒适度。然而&#xff0c;如何找到一款性价比高、品质优良的开放式耳机也是一个不小的问题。不入耳耳机哪个品牌好便宜学生&#xff1f;为了帮助大家更好地做出选择&#xff0c;我结合自…

第5章 IT服务部署实施

第5章 IT服务部署实施 5.1 概述 IT服务部署实施是衔接IT服务规划设计与IT服务运营的中间阶段&#xff0c;负责对服务组件进行客户化&#xff0c;并在充分满足客户要求的前提下&#xff0c;使用标准化的方法管理人员、资源、技术和过程&#xff0c;包括计划、实施和管理生产环…

【排序 - 快速排序】

快速排序&#xff08;Quick Sort&#xff09;是一种高效的排序算法&#xff0c;它基于分治&#xff08;Divide and Conquer&#xff09;的策略。这种排序算法的核心思想是选择一个基准元素&#xff0c;将数组分割成两部分&#xff0c;使得左边的元素都小于等于基准元素&#xf…

二分查找算法【折半查找算法】

二分查找算法 二分查找算法&#xff0c;也称为折半查找&#xff0c;是一种在有序数组中查找特定元素的高效算法。它的工作原理是通过不断地将搜索区间减半来缩小目标值可能存在的范围&#xff0c;直至找到目标值或确定目标值不存在于数组中。二分查找的关键在于每次比较都能排…

【堆 优先队列】1354. 多次求和构造目标数组

本文涉及知识点 堆 优先队列 LeetCode1354. 多次求和构造目标数组 给你一个整数数组 target 。一开始&#xff0c;你有一个数组 A &#xff0c;它的所有元素均为 1 &#xff0c;你可以执行以下操作&#xff1a; 令 x 为你数组里所有元素的和 选择满足 0 < i < target.…

瓦罗兰特游戏帧数低怎么办 瓦罗兰特游戏帧率提不上去怎么解决

瓦罗兰特是一款由拳头游戏&#xff08;Riot Games&#xff09;开发的5v5英雄射击游戏。结合了MOBA元素&#xff0c;每个角色都拥有四个独特的技能&#xff1b;提供了多种游戏模式&#xff0c;如5V5战术射击等&#xff1b;角色和皮肤设计丰富。游戏中&#xff0c;玩家将扮演各具…

《梦醒蝶飞:释放Excel函数与公式的力量》10.3 IMABS函数

第一节 10.3 IMABS函数 10.3.1 函数简介 IMABS函数是Excel中的一个工程函数&#xff0c;用于计算复数的绝对值&#xff08;模&#xff09;。在工程和科学计算中&#xff0c;复数的模是一个重要的概念&#xff0c;表示复数在复平面上到原点的距离。 10.3.2 语法&#xff1a; …

idea控制台乱码问题解决教程

注&#xff1a;按顺序来操作&#xff0c;完成后要重启软件 方案一&#xff1a;修改Tomcat的编码设置 在Tomcat的VM options中添加了-Dfile.encodingUTF-8 方案二&#xff1a;修改IDEA的编码设置 File->Settings->Editor->File Encodings 将Global Encoding、Proj…

顶顶通呼叫中心中间件-打电话没声音检查步骤(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-电话没声音检查步骤(mod_cti基于FreeSWITH) 检查步骤 1、检查配置文件 检查配置文件&#xff1a;打开ccadmin -> 配置文件 -> vars -> external_ip$${local_ip_v4}看一下这个有没有配置正确的外网IP&#xff0c;如果没有配置正确就需要配置正…

【C++】开源:drogon-web框架配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍drogon-web框架配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;…

神经网络构成、优化、常用函数+激活函数

Iris分类 数据集介绍&#xff0c;共有数据150组&#xff0c;每组包括长宽等4个输入特征&#xff0c;同时给出输入特征对应的Iris类别&#xff0c;分别用0&#xff0c;1&#xff0c;2表示。 从sklearn包datasets读入数据集。 from sklearn import darasets from pandas impor…

Puppeteer 是什么以及如何在网络抓取中使用它 | 2024 完整指南

网页抓取已经成为任何处理网页数据提取的人都必须掌握的一项重要技能。无论你是开发者、数据科学家还是希望从网站收集信息的爱好者&#xff0c;Puppeteer都是你可以使用的最强大工具之一。本完整指南将深入探讨什么是Puppeteer以及如何有效地在网页抓取中使用它。 Puppeteer简…

真正高水平的一流领导,从不和员工打成一片,这3点原因太真实

真正高水平的一流领导&#xff0c;从不和员工打成一片&#xff0c;这3点原因太真实 第一个&#xff1a;分化团队 在团队管理过程中&#xff0c;如果人不多&#xff0c;那还好。 可一旦人数多了&#xff0c;领导就不可能面面俱到&#xff0c;顾及到每一个人。 肯定会出现&am…

基于Java技术的网上图书商城系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术、SpringBoot框架 工具&#xff1a;Eclipse、Navicat、Maven 系统展示 首页 用户注册界面…