1024创新实验室-公告

助力抖音1000个粉丝,开播写代码🎉🎉

打开【抖音APP】-点击【左上角侧边栏】-【点击扫一扫】-【进行关注】🎉🎉

和1024创新实验室一起,热爱代码,热爱生活,永远年轻,永远前行🎉🎉


Skip to content

常量和枚举

一、背景与问题

如果你是全栈开发者,你应该了解服务端语言的枚举类型enum,但是对于前端而言没有枚举类型。如果你是前端开发者,你一定见过这样的代码:

js
    // 根据数字获取文件位置描述
    getFileLocationTypeDesc(value) {
      if(value === 1){
        return "本地文件服务";
      }
      if(value === 3){
        return "阿里OSS文件服务";
      }
      if(value === 3){
        return "七牛文件服务";
      }
    },
html
<div>
  <span v-if="locationType === 2">
    <input type="file"/>
  </span>
  <span v-if="locationType === 3">
    <button value="上传"/>
  </span>
</div>

如果后端把value的值修改一种类型或者新加一种类型,想必前端改起来会非常麻烦,而且极其容易出错。 那么有没有好的方式解决如下场景与问题呢?

  • 问题1: js 或者 template 中 if判断的魔法数字问题
  • 问题2:需要获取 type 对应的 中文字面意义,如列表渲染
  • 场景3:下拉列表需要显示 整个常量的 label和value对应
  • 场景4:需要将 label和value 数组,转为一个对象

二、架构思想

对于上面的情况,分析问题,有两个核心字段: 1)label,字面意义 2)value,具体的值;
比如: 性别字段: 男:1,女:0,未知:2
加上借鉴其他编程语言的常量思想:“常量放到一起”,所以肯定要将 label和value 组合的放到一起;
回到js中,组合其实就是一个对象。于是乎有了如下结构:

js
{
  label: '',
  value: 1
}
{
  label: '',
  value: 0
}

接着,如何在前端去掉魔法数字呢,那么肯定要使用变量去替换魔法数字,于是又有了下面的代码:

js
MAN = {
  label: '',
  value: 1
};
WOMAN = {
  label: '',
  value: 0
}

现在结构定义清楚了,那么接下来提供一些方法满足以上问题就可以了,请继续往下看

三、具体使用

在 SmartAdmin 1.X 中使用实验室研发的 vue-enum来解决了,但是在SmartAdmin 3.X 中还没来的及升级 vue-enum,故将这个插件写到了项目中,具体见:src/plugins/smart-enums-plugins 文件

3.1、使用方式

使用有两个步骤:

    1. constants目录创建自己的常量文件,然后定义常量,文件必须以-const为结尾,如employee-const.jsuser-const.js
    1. constants/index.js 文件中引入刚才自定义的常量(很多人容易忘记这个步骤!!!)

1)为什么要以 -const.js 为文件结尾?

  • 很方便快速找到文件,比如在文件搜索中直接输入 employee const,有且找到唯一的一个对应文件
  • 当看到文件时,知道这是一个 常量(枚举) 文件
  • 避免和 状态管理 vuex或者路由router 中、异或常量中的 employee.js 这类重名

2)写法

可以查看 constants/system/login-device-const.js, 格式必须参照如下,属性必须为valuedesc

js
export const LOGIN_DEVICE_ENUM = {
  PC: {
    value: 1,
    desc: '电脑端',
  },
  ANDROID: {
    value: 2,
    desc: '安卓',
  },
  APPLE: {
    value: 3,
    desc: '苹果',
  },
  H5: {
    value: 4,
    desc: 'H5',
  },
};

在 index.js 中引入

js
import { LOGIN_DEVICE_ENUM } from './system/login-device-const';

export default {
  LOGIN_DEVICE_ENUM,
};

3.2、使用方法

vue-enum提供三个常规方法以供页面内组件使用

方法名参数名结果
getDescByValueenumName,value根据枚举值获取描述,返回:desc
getValueDescListenumName根据枚举名获取对应的描述键值对,返回数组 [{value:desc},{value:desc}...{value:desc}]
getValueDescenumName根据枚举名获取对应的value描述键值对,返回对象

例1、在template模板中使用getDescByValue方法:

html
 <a-badge status="geekblue" />
  {{ $smartEnumPlugin.getDescByValue('CHANGE_LOG_TYPE_ENUM', item.type) }}:{{ item.version }} 版本
 </a>

例2、在 js 中使用getValueDescList方法:

js
 const internalInstance = getCurrentInstance(); // 有效  全局
 const smartEnumPlugin = internalInstance.appContext.config.globalProperties.$smartEnumPlugin;
 const valueList = smartEnumPlugin.getValueDescList('LOGIN_DEVICE_ENUM');

例3、在 js 中使用getValueDesc方法:

js
 const internalInstance = getCurrentInstance(); // 有效  全局
 const smartEnumPlugin = internalInstance.appContext.config.globalProperties.$smartEnumPlugin;
 const obj = smartEnumPlugin.getValueDesc('LOGIN_DEVICE_ENUM');

返回:
{
  1:'电脑端',
  2:'安卓',
  3:'苹果',
  4:'H5',
}

四、实现原理

说出来来原理,就是遍历遍历,再遍历,具体可以看代码 smart-enums-plugin.js


联系我们

1024创新实验室-主任:卓大,混迹于各个技术圈,研究过计算机,熟悉点 java,略懂点前端。
1024创新实验室 致力于成为中原领先、国内一流的技术团队, 以AI+数字化为驱动,用技术为产业互联网提供无限可能, 业务如下:
  • 教育领域(高职院校数字化、就业创业大数据平台、继续教育平台;在线教育系统、视频直播、题库等,包含:医学、应急管理、成考、专升本等)
  • 供应链领域(网络货运平台、大宗贸易进销存ERP、物流管理TMS、B2B电商、仓储WMS、AI提效等)
  • 中医领域(诊所数字化管理、互联网医院、AI辅助诊疗、中医适宜技术、在线云问诊、空中药房等)
  • AI+软件领域(软件定制外包、开源技术、数据大屏、国产化改造、技术升级换代、人员外包、技术顾问、技术培训等)
加微信: 卓大
拉你入群,一起学习
公众号 :六边形工程师
分享:赚钱、代码、生活
请 “1024创新实验室”
烩面里加肉
咖啡配胡辣汤,提神又饱腹
抖音 : 六边形工程师
直播:赚钱、代码、中医