优雅使用前端枚举Enum,符合国标的那种!

01、什么是枚举Enum?

枚举Enum是在多种语言中都有的一种数据类型,用于表示一组特定相关的常量数据集合,如性别(男、女)、数据状态(可用、禁用)、垂直对齐(顶端、居中、底部)、星期等。特点是数据值固定,不会变,存储和显示的内容不同。

然而在JavaScript中并没有枚举Enum类型,TypeScript算是有(本文中暂没用用TS的枚举)。在前端项目中还是会用到经常用到这类型数据的,本文就对枚举做一个通用封装,并进行尽量全局的总结。

先来看看最常用的性别:

❓你的系统中性别用的什么存储的呢?

  • 在UI上显示为Text文字描述,如表格、单选项。

  • 传输或存储时,一般会用一个有意义的字符编码,或者数字,两种方式都有也都可以。

  • 如果数据量少,可以用字符编码,如M(男)、Male(男),可读性更好,就是占用空间比数字类型多。

  • 推荐采用短整形数字表示,存储空间更小,采用一个字节的最小整形即可(值为0到255)。

image.png

针对性别的枚举值,其实是有国家标准的,国标中就是用的整数值标识。

📢参考国标:GB/T 2261.1-2003 个人基本信息分类与代码 第1部分:人的性别代码(可在线预览),早在2003年就颁布了。

image.png

SO,我们用枚举的主要目的就是处理UI、存储(编码传输)的值转换问题,兼顾显示的友好、存储的性能。在一些面向对象语言如JAVA、C#中使用体验更佳,支持枚举值的代码提示输入,避免硬编码,还可以用位运算存储多个值(算是稍微高级一点的玩法了)。


02、前端应用场景

人员选择-选择bug2.gif

1、表格数据绑定时,需要显示用户易懂的(中文)描述信息,用不同颜色样式区分,而后端返回的JSON数据中可能是编码值M/F,或1/2

image.png

2、直接显示枚举值的(中文)描述信息+样式,如elementUI中的<el-tag>组件。

image.png

3、作为表单组件的绑定数据源,如下拉选择、单选组、复选组表单组件。

image.png


03、封装EnumFactory

3.1、EnumFactory

设计一个枚举工厂 EnumFactory(enumFactory.js),统一创建枚举所需的属性和方法:

  • 参数enumObj为要传入的枚举基础定义:标准模式key:{text:'',type:''})示例:{ 1: { text: '男', type: 'priary' }, 2: { text: '女', type: 'warning' }}简写模式key:text),会被自动转换为标准模式,示例:{ left: '左对齐', center: '居中', right: '右对齐' }**value **数据结构约定:value值部分约定text为文本描述,type为样式类别(elementUI中的状态type:success/info/warning/danger),其他可随意。

  • 参数keyParseFunc 为key的转换函数,默认key为字符串,keyParseFunc 默认值为null(不转换),如果key为整数,则需要传入转换函数(传入JS内置parseInt即可)。

  • 返回值继承自参数enumObj,扩展了属性 keys、values、formatter。**keys**,枚举key数组,如 [0,1,2]["male","female","other"]**values**,值数组,包含了key,结构[{key:'',text:'',type:''}]**formatter**:elementUI中表格绑定枚举数据文本的formatter函数。

/*** 枚举创建工厂(构造函数),扩展枚举对象:keys、values(含key值的[{key,text,type}])、formatter。* @param {*} enumObj 枚举值,支持标准模式{key:{text,type},},简单模式{key:text,}(会自动转换为标准模式)* @param {*} keyParseFunc key的转换函数,默认null,如果key为整数则传 parseInt*/
export default function EnumFactory(enumObj, keyParseFunc = null) {//复制(继承)enumObjObject.assign(this, enumObj)// keys:枚举的key集合[key]Object.defineProperty(this, 'keys', {value: keyParseFunc ? Object.keys(enumObj).map(s => keyParseFunc(s)) : Object.keys(enumObj)})// 处理 valueslet values = []const ovalues = Object.values(enumObj)// 主要区分下value是简单类型(字符串)还是对象类型if (typeof ovalues[0] === 'string') {ovalues.forEach((text, index) => {const obj = { key: this.keys[index], text }values.push(obj)this[this.keys[index]] = obj})}else {ovalues.forEach((item, index) => {item.key = this.keys[index]values.push(item)})}// 设置values属性Object.defineProperty(this, 'values', { value: values })// formatter:element中表格绑定枚举数据文本的formatter函数// r、c为行列,可传入nullObject.defineProperty(this, 'formatter', {value: function(r, c, value) {return values.filter(v => v.key == value || v.text == value)[0]?.text || 'notfound'}})//枚举定义的数据都是常量,不可修改,冻结一下Object.freeze(this)
}

3.2、基于EnumFactory定义枚举值

创建一个enums.js存放常用枚举常量:

  • 性别枚举对象(key为整数)

  • 使用状态

  • 对齐方式

import EnumFactory from "@/utils/enumFactory";/*** 性别枚举对象(key为整数)*/
export const enumGender = new EnumFactory({1: { text: '男', type: 'priary' },2: { text: '女', type: 'warning' },9: { text: '其他', type: 'info' },
},parseInt)/*** 使用状态*/
export const enumUse = new EnumFactory({enable: { text: '启用', type: 'success' },disable: { text: '禁用', type: 'danger' }
})
// 对齐方式
const enumAlign = new EnumFactory({ left: '左', middle: '中', right: '右' })

enumGender的结构如下:

image.png

  • enumGender.keys: [0,1,2]

  • enumGender.values: [{"text":"其他","type":"info","key":0},{"text":"男","type":"priary","key":1},{"text":"女","type":"warning","key":2}]


04、ElementUI中使用

1、表格数据绑定时,显示用户易懂的(中文)描述信息,用不同颜色样式区分。使用自template模板自定义,或者formatter函数,格式化函数就不支持样式状态了。

🚩关键代码:enumGender[scope.row.gender]?.text

<el-table :data="table"><el-table-column label="姓名" prop="name"  width="220px"></el-table-column><el-table-column label="性别" prop="gender" align="center"  width="120px"><template slot-scope="scope"><el-tag :type="enumGender[scope.row.gender]?.type">{{ enumGender[scope.row.gender]?.text }}</el-tag></template></el-table-column><el-table-column label="方向" prop="align" :formatter="enumAlign.formatter"  width="120px"></el-table-column><el-table-column label="状态" prop="use" align="center" width="120px"><template slot-scope="scope"><el-tag :type="enumUse[scope.row.use]?.type">{{ enumUse[scope.row.use]?.text }}</el-tag></template></el-table-column>
</el-table>

效果:

image.png

2、直接显示枚举值的(中文)描述信息+样式,用type来绑定状态样式。

<el-form-item label="状态标签-all"><el-tag v-for="tag in enumGender.values" :key="tag.key" :type="tag.type" style="margin-right: 10px;">{{tag.text }}</el-tag>
</el-form-item>
<el-form-item label="状态标签-值"><el-tag :type="enumGender[value]?.type">{{ enumGender[value]?.text }} : {{ value }}</el-tag>
</el-form-item>

效果:

image.png

3、作为表单组件的绑定数据源,如下拉选择、单选组、复选组表单组件。

🚩用enumAlign.values作为源来绑定

<el-form-item label="下拉选择"><el-select v-model="value"><el-option v-for="e in enumAlign.values" :key="e.key" :value="e.key" :label="e.text"></el-option></el-select>
</el-form-item>
<el-form-item label="单选组1"><el-radio-group v-model="value"><el-radio-button v-for="item in enumAlign.values" :key="item.key" :label="item.key">{{ item.text }}</el-radio-button></el-radio-group>
</el-form-item>
<el-form-item label="单选组2"><el-radio-group v-model="value"><el-radio v-for="item in enumAlign.values" :key="item.key" :label="item.key">{{ item.text }}</el-radio></el-radio-group>
</el-form-item>

效果:

image.png


总结

其实本质上就是设计一个标准的数据结构,能够方便的获取所有枚举数据项,然后根据值快速获取显示的文本。

文章转载自:安木夕

原文链接:https://www.cnblogs.com/anding/p/17627416.html

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

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

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

相关文章

AD9226 65M采样 模数转换

目录 AD9220_ReadTEST AD9220_ReadModule AD9226_TEST_tb 自己再写个 260M的时钟&#xff0c;四分频来提供65M的时钟。 用 vivado 写的 AD9226_ReadTEST module AD9226_ReadTEST( input clk, input rstn,output clk_driver, //模块时钟管脚 input [12:0]IO_data, //模块数…

深度学习 精选笔记(5)多层感知机

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

spring自定义事件监听器

1. 创建自定义事件 import org.springframework.context.ApplicationEvent; import java.util.List;public class CollectionCreateEvent extends ApplicationEvent {private List<String> fileList;public CollectionCreateEvent(Object source,List<String> file…

vscode——本地配置(C和C++环境配置)(2)

vscode——本地配置&#xff08;2&#xff09; 配置C语言编译看看.json文件编译多个C文件C/C调试 今天我们继续来看vscode的配置&#xff0c;如果没看过上一次的文章&#xff0c;大家可以点击&#xff1a; https://blog.csdn.net/qq_67693066/article/details/136315696 配置C语…

【漏洞复现】鸿运(通天星CMSV6车载)主动安全监控云平台存在敏感信息泄露漏

漏洞描述 鸿运(通天星CMSV6车载)主动安全监控云平台实现对计算资源、存储资源、网络资源、云应用服务进行7*24小时全时区、多地域、全方位、立体式、智能化的IT运维监控,保障IT系统安全、稳定、可靠运行。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法…

leetcode 3.反转链表;

1.题目&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 2.用例&#xff1a; 3.题目解析&#xff1a; &#xff08;1&#xff09;函数头&#xff1a; 要求返回结点&#xff0c;就 ListNode* reverseList(ListNode* head)&…

海量物理刚体 高性能物理引擎Unity Physics和Havok Physics的简单性能对比

之前的博客中我们为了绕过ECS架构&#xff0c;相当于单独用Batch Renderer Group实现了一个精简版的Entities Graphics&#xff0c;又使用Jobs版RVO2实现了10w人同屏避障移动。 万人同屏对抗割草 性能测试 PC 手机端 性能表现 弹幕游戏 海量单位同屏渲染 锁敌 避障 非ECS 那么有…

Android Activity启动模式

文章目录 Android Activity启动模式概述四种启动模式Intent标记二者区别 Android Activity启动模式 概述 Activity 的管理方式是任务栈。栈是先进后出的结构。 四种启动模式 启动模式说明适用场景standard标准模式默认模式&#xff0c;每次启动Activity都会创建一个新的Act…

最新IE跳转Edge浏览器解决办法(2024.2.26)

最新IE跳转Edge浏览器解决办法&#xff08;2024.2.26&#xff09; 1. IE跳转原因1.1. 原先解决办法1.2. 最新解决办法1.3. 最后 1. IE跳转原因 关于IE跳转问题是由于在2023年2月14日&#xff0c;微软正式告别IE浏览器&#xff0c;导致很多使用Windows10系统的电脑在打开IE浏览…

kubectl 声明式资源管理方式

目录 介绍 YAML 语法格式 命令 应用yaml文件指定的资源 删除yaml文件指定的资源 查看资源的yaml格式信息 查看yaml文件字段说明 查看 api 资源版本标签 修改yaml文件指定的资源 离线修改 在线修改 编写yaml文件 创建资源对象 查看创建的pod资源 创建service服务对…

虚拟机CentOS7仓库被禁用无法进行yum命令

执行yum repolist all命令时&#xff0c;仓库全被禁用 使用sudo yum-config-manager --enable C7.5.1804-base/x86_64去尝试启用其中的仓库时没反应 通过ls /etc/yum.repos.d/命令发现 [rootlocalhost ~]# ls /etc/yum.repos.d/ CentOS-Base.repo.bak CentOS-fasttrack.repo Ce…

博途PLC 单通气缸功能块(SCL源代码)

气缸是工业现场应用非常多的一个重要执行器,气缸在很多场合都有大量应用,今天我们的对象就是"单通气缸",不同的工程师,不同的应用行业,大家对气缸功能块的封装会有所不同。气缸功能块的其它封装大家可以参看下面文章 1、气缸功能块 https://rxxw-control.blog…

Flutter(三):Stack、Positioned、屏幕相关尺寸、Navigator路由跳转

页面尺寸 通知栏高度&#xff1a;MediaQuery.of(context).padding.top顶部导航高度&#xff1a;kToolbarHeight底部导航高度&#xff1a;kBottomNavigationBarHeight屏幕宽&#xff1a;MediaQuery.of(context).size.width屏幕高&#xff1a;MediaQuery.of(context).size.height…

【计算机】本科考研还是就业?

其实现在很多计算机专业的学生考研&#xff0c;也是无奈的选择 技术发展日新月异&#xff0c;而在本科阶段&#xff0c;大家学着落后的技术&#xff0c;出来找工作自然会碰壁。而且现在用人单位的门槛越来越高&#xff0c;学历默认研究生起步&#xff0c;面试一般都是三轮起步…

第十四天-网络爬虫基础

1.什么是爬虫 1.爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff09;&#xff0c;是按照一定规则&#xff0c;自动的抓取万维网中的程序或者脚本&#xff0c;是搜索引擎的重要组成&#xff1b;比如&#xff1a;百度、 2.爬虫应用&#xff1a;1.搜索引擎&…

一周学会Django5 Python Web开发-Django5列表视图ListView

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计27条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

初识Maven

介绍&#xff1a; web后端开发技术ApacheMaven是一个项目管理和构建工具&#xff0c;它基于项目对象模型&#xff08;POM&#xff09;的概念&#xff0c;通过一小段描述信息来管理项目的构建。安装&#xff1a;http://maven.apache.org/ Apache软件基金会&#xff0c;成立于19…

矩阵的范数 matrix norm Frobenius norm 弗罗贝尼乌斯 范数

1&#xff0c;矩阵范数的定义 矩阵的范数&#xff0c;matrix norm即矩阵的模&#xff1b;它把一个矩阵空间变成为赋范线性空间&#xff1b; 从一个矩阵空间映射到非负实数的函数 满足以下条件&#xff1a; 1&#xff0c;严格的正定性。对于 , 则 ; and if , must ; 2&…

2024年【通信安全员ABC证】考试资料及通信安全员ABC证找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年通信安全员ABC证考试资料为正在备考通信安全员ABC证操作证的学员准备的理论考试专题&#xff0c;每个月更新的通信安全员ABC证找解析祝您顺利通过通信安全员ABC证考试。 1、【单选题】《安全色》&#xff08;Gb…

幻兽帕鲁(Palworld 1.4.11.5.0)私有服务器搭建(docker版)

文章目录 说明客户端安装服务器部署1Panel安装和配置docker服务初始化设置设置开机自启动设置镜像加速 游戏服务端部署游戏服务端参数可视化配置 Palworld连接服务器问题总结 服务端升级&#xff08;1.5.0&#xff09; 说明 服务器硬件要求&#xff1a;Linux系统/Window系统&a…