vue3-实战-04-管理后台表单校验-layout-菜单组件封装

news2024/9/24 21:20:34

目录

1-自定义校验规则

2-layout组件静态页面搭建

3-logo组件封装

4-左侧菜单静态组件搭建

4.1-动态获取菜单数据

4.2-封装菜单动态展示组件

4.3-配置菜单名称-隐藏-图标属性

4.4-菜单刷新定位当前菜单

5-内容展示区组件封装

1-自定义校验规则

       上一篇我们在登录表单进行了基础的表单校验,但是在实际开发项目过程中,我们需要自定义校验规则,比如手机号,身份证号,邮箱等校验...需要使用相关或者复杂的正则表达式来校验。比如我们自定义校验用户名密码(参考element-plus官网form表单自定义校验):

2-layout组件静态页面搭建

       我们分析一下,一般的后台管理系统分为三部分,左侧-顶部-内容区三个;我们需要对layout进行三块划分。

组件文件:src\layout\index.vue;将路由登录成功后展示的页面替换为该组件

 为了方便开发者根据自己的实际情况,自行决定页面样式的宽-高-颜色等相关参数,我们将一些参数抽取为全局变量,变更一处就好。

 

<template>

  <div class="layout_container">
    <!--左侧菜单 -->
    <div class="layout_slider">123</div>

    <!--顶部导航 -->
    <div class="layout_tabbar">456</div>

     <!--内容展示区 -->
    <div class="layout_main">
        789
    </div>

    
  </div>
</template>

<script setup lang="ts"></script>

<style scoped lang="scss">
.layout_container{
    width: 100%;
    height: 100vh;
    .layout_slider{
        width: $base-menu-width;
        height: 100vh;
        background: $base-menu-background;
    }
    .layout_tabbar{
       position: fixed;
       width: calc(100% - $base-menu-width); 
       height: $base-tabbar-height;
       background: cyan;
       top: 0px;
       left: $base-menu-width;
    }
    .layout_main{
        position: absolute;
        width: calc(100% - $base-menu-width);
        height: calc(100vh - $base-tabbar-height);
        left: $base-menu-width;
        top: $base-tabbar-height;
        padding: 20px;
        background: yellowgreen;
        overflow: auto;//防止内容过多撑起整个页面,导致页面不好看

    }

}
</style>

3-logo组件封装

       我们将项目菜单上的logo组件进行封装,封装为一个组件src\layout\logo\index.vue在layout组件中引入,我们对logo的标题-图片-展示与否 都可以做成配置文件方便开发者自行决定是否展示。

 src\setting.ts内容如下:

//用于项目logo|标题配置
export default {
  title: '羊叔运营平台', //项目的标题
  logo: '/logo.png', //项目logo设置
  logoHidden: true,//logo组件是否隐藏设置
}

4-左侧菜单静态组件搭建

      我们需要对左侧菜单进行静态页面开发和搭建,实际项目中,菜单的获取是通过接口获取是动态的,我们需要动态展示菜单。但是有一些路由组件,不是后台返回的,比如常量路由,任意路由和404路由等;所以我们有些路由组件是不需要展示在菜单栏中,我们可以在路由组件中meta中添加字段来控制隐藏和显示,我们通过给meta中添加标题字段来动态展示菜单的标题,我们还需要给菜单名字前面显示图标等,我们将element-plus图标注册为全局组件,然后在路由配置中meta中增加一个图标属性,动态展示菜单。

4.1-动态获取菜单数据

      目前因为我们没有调用后台接口,我们先把所有的路由都配置在常量路由里面,所有用户都展示一样的页面菜单。但是我们如何获取所有的路由呢?采用仓库形式获取,在用户小仓库的state对象UserState中定义一个属性menuRoutes,属性的类型是RouteRecordRaw,通过使用这个类型就可以获取到所有的路由配置。

4.2-封装菜单动态展示组件

       通过4.1我们可以获取到所有的路由组件信息,这个时候我们将这些信息封装为一个菜单组件,这样只需要传递获取的菜单路由数据,就可以展示。 在src\layout\index.vue文件中,我们使用

 菜单组件src\layout\menu\index.vue的内容如下:

<template>
    <template v-for="(item) in menuList" :key="item.path">
        <!--没有子路由-->
        <template v-if="!item.children">
            <el-menu-item :index="item.path" v-if="!item.meta.hidden" @click="goRoute">
                <el-icon>
                    <!--component vue框架提供的全局组件,可以直接使用-->
                    <component :is="item.meta.icon"></component>
                </el-icon>
                <template #title>
                    <span>{{ item.meta.title }}</span>
                </template>
            </el-menu-item>
        </template>
        <!-- 有子路由但是只有一个子路由 -->
        <template v-if="item.children && item.children.length == 1">
            <el-menu-item :index="item.children[0].path" v-if="!item.children[0].meta.hidden" @click="goRoute">
                <el-icon>
                    <component :is="item.children[0].meta.icon"></component>
                </el-icon>
                <template #title>
                    <span>{{ item.children[0].meta.title }}</span>
                </template>
            </el-menu-item>
        </template>
        <!-- 有子路由且个数大于一个1 -->
        <el-sub-menu :index="item.path" v-if="item.children && item.children.length > 1">
            <template #title>
                <el-icon>
                    <component :is="item.meta.icon"></component>
                </el-icon>
                <span>{{ item.meta.title }}</span>
            </template>
            <Menu :menuList="item.children"></Menu>
        </el-sub-menu>
    </template>
</template>

<script setup lang="ts">
import { useRouter } from 'vue-router';
//获取父组件传递过来的全部路由数组
defineProps(['menuList']);

//获取路由器对象
let $router = useRouter();
//点击菜单的回调
const goRoute = (vc: any) => {
    //路由跳转
    $router.push(vc.index);
}
</script>
<script lang="ts">
export default {
    name: 'Menu'
}
</script>

<style scoped></style>

核心逻辑循环遍历路由数据,按照不同的条件展示在页面上。

ps:
1-父子组件通信,采用defineProps来接受数据;
2-需要递归处理菜单,使用添加了一段js代码

<script lang="ts">
export default {
    name: 'Menu'
}
</script>

4.3-配置菜单名称-隐藏-图标属性

       将图标注册为全局组件,这样我们在项目中就可以直接使用图标的名称进行获取图标。配置方式参考官网:Icon 图标 | Element Plus

我们在路由配置文件中,配置相关的菜单名称,是否隐藏,图标等属性。

4.4-菜单刷新定位当前菜单

当我们点击某个二级菜单时候,点击浏览器刷新,所有菜单都折叠了,不能定位到之前选中的菜单,我们优化一下。需要使用到element-plus菜单组件的default-active属性。

 

5-内容展示区组件封装

我们将layout的内容展示区,也封装为一个组件,这样我们方便复用,

文件src\layout\main\index.vue的内容如下:

<template>
  <!-- 路由组件出口的位置 -->
  <router-view v-slot="{ Component }">
    <transition name="fade">
        <!-- 渲染一级路由的子路由 -->
      <component :is="Component" />
    </transition>
  </router-view>
</template>

<script setup lang="ts">
</script>
<script lang="ts">
export default {
  name: 'Main',
}
</script>

<style scoped>
fade-enter-from {
    opacity: 0;
    transform: scale(0);
}

.fade-enter-active {
    transition: all .3s;
}

.fade-enter-to {
    opacity: 1;
    transform: scale(1);
}
</style>

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

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

相关文章

Vue.js 中的动态组件是什么?如何使用动态组件?

Vue.js 中的动态组件是什么&#xff1f;如何使用动态组件&#xff1f; Vue.js是一种流行的前端框架&#xff0c;它提供了一种称为“动态组件”的技术&#xff0c;使得我们可以动态地切换组件的内容和结构。在本文中&#xff0c;我们将深入探讨Vue.js中的动态组件&#xff0c;包…

我踩过的那些坑,浅谈一下如何更优雅地使用 Linux

前言 相信很多尝鲜过桌面 Linux 系统的朋友&#xff0c;对它一个很深刻的印象就是稳定性差&#xff1a;不知道怎么就把系统搞崩了&#xff0c;又找不到问题的具体原因和解决方法&#xff0c;只能尝试重装&#xff0c;直到心力交瘁地回到了 Windows 或 macOS。但另一方面&#…

实例明确的和模型自适应监督的半监督语义分割

文章目录 Instance-specific and Model-adaptive Supervision for Semi-supervised Semantic Segmentation摘要本文方法Quantitative hardness analysisModel-adaptive supervisionIntensity-based augmentationsCutMix-based augmentationsModel-adaptive unsupervised loss 实…

第四章 Electron|Node 使用SQLite3数据库

一、SQLite是什么 &#x1f447; &#x1f447; &#x1f447; SQLite是一种嵌入式关系型数据库管理系统&#xff0c;是一个零配置、无服务器的、自给自足的、事务性的SQL数据库引擎。SQLite是一个轻量级的数据库&#xff0c;可以在各种操作系统上使用&#xff0c;并且支持SQL…

网络名词术语解析 | 路由、交换机、集线器、半/全双工、DNS、LAN、WAN、端口、MTU

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

Python 数据可视化

Python 数据可视化 Python提供了多个用于数据可视化的工具和库。其中最常用的包括&#xff1a; 1. Matplotlib&#xff1a;Matplotlib 是一个用于绘制二维图形的 Python 库。它提供了广泛的绘图选项&#xff0c;可以帮助您创建线图、散点图、柱状图、饼图、等高线图、3D 图形…

linuxOPS基础_linux网络配置

ifconfig查看网络信息 命令&#xff1a;ifconfig 作用&#xff1a;获取网卡的相关信息 语法&#xff1a;# ifconfig 示例1 查看网络信息 案例1使用ifconfig查看linux网络配置 ifconfig注意&#xff0c;我们发现当前ens33看不到IP地址信息&#xff0c;那是因为网卡默认不启…

如何为您的企业培养社交媒体粉丝(16种方式)

增加社交媒体关注度似乎很困难&#xff0c;但这对各种规模的企业来说都是一项重要任务。通过正确的方法&#xff0c;可以吸引忠实的追随者并在社交媒体上建立强大的影响力。在本文中&#xff0c;我们将探讨 16 种有效的方法来增加您的社交媒体粉丝并与您的受众互动。 目录 为…

Java实现LL1语法分析器【编译原理】

java通过预测分析法实现语法分析程序【编译原理】 前言推荐实验要求需知LL1工作原理 Java实现LL1语法分析器0实验步骤LL1.javaGrammar.javaLeftRecursion.javaFirstAndFollow.javaAnalyzeTable.javaLL1Stack.java实验结果 Java实现LL1语法分析器1Grammar.javaProduction.javaFi…

Three.js——九、纹理贴图、纹理对象阵列、地面网格辅助观察、UV坐标以及动画

创建纹理贴图 const geometry new THREE.PlaneGeometry(100, 100); //纹理贴图加载器TextureLoader const texLoader new THREE.TextureLoader(); // .load()方法加载图像&#xff0c;返回一个纹理对象Texture const texture texLoader.load(new URL(../assets/img/zhizhen…

IRIS75 DM蓝牙5.2双模热插拔PCB

键盘使用说明索引&#xff08;均为出厂默认值&#xff09; 软件支持&#xff08;驱动的详细使用帮助&#xff09;一些常见问题解答&#xff08;FAQ&#xff09;首次使用步骤蓝牙配对规则&#xff08;重要&#xff09;蓝牙和USB切换键盘默认层默认触发层0的FN键配置的功能默认功…

B站恰饭视频汇总,如何查找不同行业的品牌商单和恰饭视频?

随着“短视频时代”来临&#xff0c;广告主都在重点布局短视频平台&#xff0c;尝试用长短视频平台协同投放的方式来提高广告点击率。B站作为短视频产出的高质量平台&#xff0c;也是许多年轻人活跃的聚焦地&#xff0c;拥有很强的用户粘性和无限的商业潜力&#xff0c;是广告主…

港联证券|如何抓住牛股?股票为什么能够连续涨停?

牛股是指在股票市场中表现出色、股价涨幅较大的个股&#xff0c;对于投资者来说&#xff0c;抓住牛股是实现投资目标的关键之一。那么如何抓住牛股&#xff1f;股票为什么能够连续涨停&#xff1f;港联证券也为大家准备了相关内容&#xff0c;以供参考。 如何抓住牛股&#xff…

迅为RK3568开发板Buildroot 系统设置屏幕旋转

迅为支持的触摸屏幕有四种&#xff1a; MIPI 7 寸屏幕&#xff08;默认物理屏幕为竖屏&#xff09; LVDS 7 寸屏幕&#xff08;默认物理屏幕为竖屏&#xff09; LVDS 10.1 寸 1024*600 屏幕&#xff08;默认物理屏幕为横屏&#xff09; LVDS 10.1 寸 1280*800 屏幕&#xf…

代码随想录二刷 day13 | 栈与队列 之 239. 滑动窗口最大值 347.前 K 个高频元素

day13 239. 滑动窗口最大值347.前 K 个高频元素 239. 滑动窗口最大值 题目链接 解题思路&#xff1a; 设计单调队列的时候&#xff0c;pop和push操作要保持如下规则&#xff1a; pop(value)&#xff1a;如果窗口移除的元素value等于单调队列的出口元素&#xff0c;那么队列弹…

拜登签字了

* * * 原创&#xff1a;刘教链 * * * 号外&#xff1a;今天在“刘教链Pro”发表了一篇《对PoS的链重建攻击》&#xff0c;总结了一下最近关于PoW和PoS安全性的碰撞&#xff0c;抛砖引玉&#xff0c;欢迎关注“刘教链Pro”并阅读。 * * * 隔夜比特币仍在27k上方盘旋。盘旋之中微…

数据万象 | AIGC 存储内容安全解决方案

AIGC&#xff08;人工智能生产内容&#xff09; 已经成为与PGC&#xff08;专业生产内容&#xff09;、UGC&#xff08;用户生产内容&#xff09;并驾齐驱的内容生产方式。由于 AI 的特性&#xff0c;AIGC在创意、个性化、生产效率等方面具有独特的优势&#xff0c;这些优势可以…

Hadoop中MapReduce概述

MapReduce概述 MapReduce定义MapReduce优缺点MapReduce核心思想MapReduce进程MapReduce编程规范MapTask并行度决定机制ReduceTask并行度决定机制mapreduce中job的提交流程MapReduce工作流程shuffle机制分区partition数据清洗&#xff08;ETL&#xff09;进一步分析MapTask和Red…

项目经理如何制定工作计划?做到这3点就够了

工作计划的重要性在于明确目标和实现具体步骤&#xff0c;协调大家一致行动&#xff0c;增强工作的主动性&#xff0c;减少工作的盲目性&#xff0c;让工作有条不紊地进行。同时&#xff0c;制定计划也可以对工作进度和质量有个保证和标准&#xff0c;对大家的工作有约束和督促…

Android Native crash问题分析

1、准备材料 android-ndk-r21b工具&#xff1a;addr2line和objdump工具。 .so库&#xff1a;crash对应的带符号表的共享库 源代码code&#xff1a;crash对应的源码文件 tombstone&#xff1a;Android系统产生的墓碑文件 2、 tombstone墓碑文件分析 关键信息&#xff1a; c…