都3202年了,不会还有人硬编码使用枚举值吧?

由于多页面有时需要共同的表单枚举选择,页面以及table需要显示枚举值label以及有时需要根据枚举值进行业务逻辑判断,如果使用硬编码写死每个枚举值的话,则不利于后续的维护。如下:

// 根据特定枚举值进行业务逻辑判断
if (c.type == 1) {
  ...执行业务逻辑操作
}

// 编辑页或输入框的表单选择枚举值
<el-form-item prop="type" label="类型" required>
    <el-select v-model="form.type" placeholder="请选择资源类型">
        <el-option :key="1" :label="菜单" :value="1"> </el-option>
        <el-option :key="2" :label="资源" :value="2"> </el-option>
    </el-select>
</el-form-item>

// table页或详情页需要根据枚举值获取对应的描述label
switch(type) {
  case 1:
    return "菜单";
  case 2:
    return "资源
}


可以发现上诉的硬编码方式,如果后续需要新增枚举,或者改变枚举值的话则用到硬编码的地方都需要进行调整,改动起来还是很费劲的,故推荐使用如下方式进行重构,使用方式详见如下:

新建Enum.ts

在系统公共模块如common文件夹下新建一个Enum.ts文件,代码如下:

export interface EnumValueTag {
    color?: string;
    type?: string;
}

/**
 * 枚举值类
 */
export class EnumValue {
    /**
     * 枚举值
     */
    value: any;

    /**
     * 枚举描述
     */
    label: string;

    /**
     * 展示的标签信息
     */
    tag: EnumValueTag;

    constructor(value: any, label: string) {
        this.value = value;
        this.label = label;
    }

    /**
    * tag相关的方法主要用于PageTable.vue公共分页组件对枚举值进行el-tag标签展示
    */
    setTagType(type: string = 'primary'): EnumValue {
        this.tag = { type };
        return this;
    }

    tagTypeInfo(): EnumValue {
        return this.setTagType('info');
    }

    tagTypeSuccess(): EnumValue {
        return this.setTagType('success');
    }

    tagTypeDanger(): EnumValue {
        return this.setTagType('danger');
    }

    tagTypeWarning(): EnumValue {
        return this.setTagType('warning');
    }

    setTagColor(color: string): EnumValue {
        this.tag = { color };
        return this;
    }

    public static of(value: any, label: string): EnumValue {
        return new EnumValue(value, label);
    }

    /**
     * 根据枚举值获取指定枚举值对象
     *
     * @param enumValues 所有枚举值
     * @param value 需要匹配的枚举值
     * @returns 枚举值对象
     */
    static getEnumByValue(enumValues: EnumValue[], value: any): EnumValue | null {
        for (let enumValue of enumValues) {
            if (enumValue.value == value) {
                return enumValue;
            }
        }
        return null;
    }

    /**
     * 根据枚举值获取枚举描述
     *
     * @param enums 枚举对象
     * @param value 枚举值
     * @returns 枚举描述
     */
    static getLabelByValue(enums: any, value: any) {
        const enumValues = Object.values(enums) as any;
        for (let enumValue of enumValues) {
            if (enumValue['value'] == value) {
                return enumValue['label'];
            }
        }
        return '';
    }
}

export default EnumValue;

创建业务枚举enum.ts

在各个业务模块(如:@/view/system/enum.ts)下新建一个业务专属的enum.ts,用于维护该模块所用到的所有枚举值。如下:

import { EnumValue } from '@/common/Enum';

export const ResourceTypeEnum = {
    Menu: EnumValue.of(1, '菜单'),
    Permission: EnumValue.of(2, '权限'),
};

// tagTypeSuccess()主要用于表格展示时使用特定类型的tag展示,可见PageTable组件
export const AccountStatusEnum = {
    Enable: EnumValue.of(1, '正常').tagTypeSuccess(),
    Disable: EnumValue.of(-1, '禁用').tagTypeDanger(),
};

使用方式

接下来就可在需要的页面导入对应的枚举即可,常见使用常见如下:

  1. 编辑页以及搜索框等需要选择对应的枚举值,如下
import { ResourceTypeEnum } from '../enums';


    
        // 不需要手动写多个枚举值对应的value以及label
         
    

都3202年了,不会还有人硬编码使用枚举值吧?_第1张图片

  1. 根据枚举值显示对应的枚举描述,如图需要将枚举值 ‘1’ 转为 ‘菜单’,如下
import { ResourceTypeEnum } from '../enums';
  

    {{ EnumValue.getLabelByValue(ResourceTypeEnum, infoDialog.data.type) }}

都3202年了,不会还有人硬编码使用枚举值吧?_第2张图片

  1. 根据指定枚举值进行特定业务逻辑处理,如下:
import { ResourceTypeEnum } from '../enums';

// 菜单类型,才展示该输入框

    
        
    


// js函数中对类型进行判断并进行相应逻辑处理(该种方式也可代码自动提示,方便快捷又友好)
const addResource = () => {
  if (c.type === ResourceTypeEnum.Permission.value) {
      ...执行xxx业务逻辑
  }
}

总结

通过如上方式对枚举进行包装改造后,对枚举的全部操作都可以避免使用硬编码的方式,使用起来更加方便快捷,后续维护起来也很方便,不需要到处改动。在使用过程中编辑器也会自动进行代码提示,方便快捷又友好。

更多代码详见:https://gitee.com/objs/mayfly-go
一个web版 linux(终端[终端回放] 文件 脚本 进程 计划任务)、数据库(mysql postgres)、redis(单机 哨兵 集群)、mongo统一管理操作平台

你可能感兴趣的:(vue,前端,javascript,vue,typescript)