项目中的枚举值你是怎么处理的

140 阅读2分钟

假设有这样一个场景,我们需要查询一个代办列表。首先,查询条件中涉及到一个代办的下拉列表;其次,列表中会展示代办状态;另外js中会针对不同的代办做不同的逻辑处理。如果我们与后端约定0代表进行中,1代表已完成,2代表已取消,甚至更多。。。如果我们不做任何处理,试想项目中大量的0,1,2是不是让人看的很难受,又不懂何意。。。如果这个枚举值用在多个业务场景中。。。那有没有什么好的方式去处理呢?

一开始我是这样处理的。 在项目中新建constant目录,新增index.js,用于统一维护枚举值

export const TODO_STATUS = {
    PENDING : 0, //进行中
    DONE : 1, // 已完成
    CANCELED :2 // 已取消
}

项目中使用

1.查询项是一个下拉框,定义options的值

   {
        type: "select",
        label: "待办状态",
        prop: "status",
        options: [
          { label: "进行中", value: TODO_STATUS.PENDING },
          { label: "已完成", value: TODO_STATUS.DONE },
          { label: "已取消", value: TODO_STATUS.CANCELED }
        ]
  },
import { TODO_STATUS } from "@/constant";

//底下可以做一些逻辑处理

看上去还行哈,项目中没有大量的0,1,2。。。,但是感觉还不是很完美,枚举值和options定义了2次,那能否结合呢?

直接看代码吧!

src/enums/enumFactory.js


export class EnumFactory {
  constructor(enums) {
    this.enums = enums;
    // Define getters for each enum item
    Object.keys(enums).forEach((key) => {
      Object.defineProperty(this, key, {
        get: () => this.enums[key].value,
      });
    });
  }
  freezeEnums(enums) {
    const frozenEnums = {};
    Object.keys(enums).forEach(key => {
      const value = enums[key];
      if (typeof value === 'object' && value !== null) {
        frozenEnums[key] = this.freezeEnums(value); // Recursively freeze nested objects
      } else {
        frozenEnums[key] = value;
      }
    });
    return Object.freeze(frozenEnums);
  }
  getItems() {
    const items = Object.values(this.enums);
    return items;
  }
  getLabelByValue(id) {
    const items = this.getItems();
    const label = items.find((item) => item.value === id)?.label;
    return label || '';
  }
 getAllLabels() {
    const items = this.getItems();
    return items.map(item => item.label);
  }
  getAllValues(){
    const items = this.getItems();
    return items.map(item => item.value);
  }
}
export function createEnumFactory(enums){
    return new EnumFactory(enums)
}

src/enums/index.js

//如何将options配置和枚举值结合
export const TODO_STATUS = createEnumFactory({
  PENDING: {
    label: "进行中",
    value: "pending",
    id: "0",
  },
  DONE: {
    label: "已完成",
    value: "done",
    id: "1",
  },
  CANCELED: {
    label: "已取消",
    value: "cancel",
    id: "2",
  },
});

这样项目中如果需要获取下拉数据就可以直接使用

TODO_STATUS.getItems()

如果需要将后端列表中返回的value转为lable就可以直接这样

TODO_STATUS.getLabelByValue(cellvalue)

大家觉得怎么样呢?你平常都是怎么处理的呢?