vue3枚举值统一管理维护

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

typescript 复制代码
// 根据特定枚举值进行业务逻辑判断
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文件,代码如下:

typescript 复制代码
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,用于维护该模块所用到的所有枚举值。如下:

typescript 复制代码
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. 编辑页以及搜索框等需要选择对应的枚举值,如下
vue 复制代码
import { ResourceTypeEnum } from '../enums';

<el-form-item class="w100" prop="type" label="类型" required>
    <el-select class="w100" v-model="form.type" placeholder="请选择资源类型">
        // 不需要手动写多个枚举值对应的value以及label
        <el-option v-for="item in ResourceTypeEnum" :key="item.value" :label="item.label" :value="item.value"> </el-option>
    </el-select>
</el-form-item>
  1. 根据枚举值显示对应的枚举描述,如图需要将枚举值 '1' 转为 '菜单',如下
vue 复制代码
import { ResourceTypeEnum } from '../enums';
  
<el-descriptions-item label="类型">
    <el-tag size="small">{{ EnumValue.getLabelByValue(ResourceTypeEnum, infoDialog.data.type) }}</el-tag>
</el-descriptions-item>
  1. 根据指定枚举值进行特定业务逻辑处理,如下:
vue 复制代码
import { ResourceTypeEnum } from '../enums';

// 菜单类型,才展示该输入框
<el-col v-if="form.type === ResourceTypeEnum.Menu.value">
    <el-form-item class="w100">
        <el-input v-model.trim="form.meta.routeName" placeholder="请输入路由名称"></el-input>
    </el-form-item>
</el-col>

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

总结

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

更多代码详见:gitee.com/objs/mayfly...

一个web版 linux(终端终端回放 文件 脚本 进程 计划任务)、数据库(mysql postgres)、redis(单机 哨兵 集群)、mongo统一管理操作平台

相关推荐
易朵朵8 小时前
CSS 格式化上下文
css·vue.js
xieter8 小时前
【技术精选】深入浅出现代前端渲染与性能优化实践指南 (2026-10-04)
前端·javascript
xieter8 小时前
【硬核实战】TypeScript Compiler API: Preserving Child Node Narrowing in Reusable Type Guards 🔧 (2026-10-03)
前端·javascript
xieter8 小时前
【硬核实战】React 19 useFormStatus Returning False? I Built a SubmitButton That Fixes It (2026-10-03)
前端·javascript
雪芽蓝域zzs9 小时前
第6节:远程搜索弹窗(remote 模式),弹窗滚动加载分页
vue.js·elementui
paopaokaka_luck10 小时前
非遗文物数字化小程序(AI非遗问答、ONNX图像识别、协同过滤推荐、ECharts数据分析、非遗知识浏览与互动、文创商城订单闭环、文化活动报名签到、社区交流)
javascript·spring boot·mysql·数据分析·echarts·mybatis
Highcharts.js10 小时前
图表开发实战总结| 7 条“黄金法则”与“性能铁律”
前端·javascript·vue.js·编辑器·时序数据库·highcharts
Helix25010 小时前
Electron、WebView 框架与 HTA 对比:桌面应用选型、安全性与现代替代方案
前端·javascript·electron·webview·vbscript·hta·本地html应用
Ikalus198811 小时前
三套 API 都告诉我成功了,浏览器一个字都没收到
javascript
Ikalus198811 小时前
计数器停在 0,我差点把一篇空摘要发出去
javascript