通过接口获取字典的数据进行渲染

通过接口获取字典的数据进行渲染

完整的代码

js 复制代码
// 定义字典类型枚举(语义化)
enum DictType {
  NORMAL = 1,    // 普通字典
  INTEGER = 2,   // 整数字典
  PRODUCT = 3    // 产品类型字典
}

// 字典项通用类型
type DictItem = {
  label?: string;
  value?: string | number;
  name?: string;
  productType?: string | number;
  [key: string]: any;
};

// 声明外部依赖函数类型
declare function getDictOptions(dictKey: string): DictItem[];
declare function getIntDictOptions(dictKey: string): DictItem[];
declare function getCellTypeOption(): DictItem[];

/**
 * 根据字典值获取对应的文本标签
 * @param val 要匹配的字典值
 * @param dictKey 字典标识(用于获取字典列表)
 * @param type 字典类型
 * @returns 匹配的文本标签,匹配不到返回原始值
 */
const getDictText = (
  val: string | number | undefined | null,
  dictKey: string,
  type: DictType
): string | number | undefined | null => {
  // 空值直接返回
  if (val === undefined || val === null) return val;

  // 类型配置映射
  const configMap: Record<DictType, {
    keyLabel: keyof DictItem;
    keyValue: keyof DictItem;
    getList: () => DictItem[];
  }> = {
    [DictType.NORMAL]: {
      keyLabel: 'label',
      keyValue: 'value',
      getList: () => getDictOptions(dictKey)
    },
    [DictType.INTEGER]: {
      keyLabel: 'label',
      keyValue: 'value',
      getList: () => getIntDictOptions(dictKey)
    },
    [DictType.PRODUCT]: {
      keyLabel: 'name',
      keyValue: 'productType',
      getList: () => getCellTypeOption()
    }
  };

  // 获取配置(兜底到普通字典)
  const { keyLabel, keyValue, getList } = configMap[type] || configMap[DictType.NORMAL];
  const dictList = getList() || [];

  // 查找匹配项
  const matchItem = dictList.find(item => item[keyValue] == val);

  return matchItem ? matchItem[keyLabel] : val;
};
代码解释
js 复制代码
declare function getDictOptions(dictKey: string): DictItem[];
declare function getIntDictOptions(dictKey: string): DictItem[];
declare function getCellTypeOption(): DictItem[];
// 这个三个方法都是外部调用字典接口的方法
js 复制代码
export const getDictOptions = (dictType: string) => {
  return dictStore.getDictByType(dictType) || []
}

export const getIntDictOptions = (dictType: string): NumberDictDataType[] => {
  // 获得通用的 DictDataType 列表
  const dictOptions: DictDataType[] = getDictOptions(dictType)
  // 转换成 number 类型的 NumberDictDataType 类型
  // why 需要特殊转换:避免 IDEA 在 v-for="dict in getIntDictOptions(...)" 时,el-option 的 key 会告警
  const dictOption: NumberDictDataType[] = []
  dictOptions.forEach((dict: DictDataType) => {
    dictOption.push({
      ...dict,
      value: parseInt(dict.value + '')
    })
  })
  return dictOption
}
getCellTypeOption() {
    const cellTypeList = wsCache.get(CACHE_KEY.CELL_TYPE_CACHE)
    if (cellTypeList) {
    this.cellTypeList = cellTypeList
    }
    // this.cellTypeList.map((v) => {
    //   return { ...v, label: v.name, value: v.id, disabled: v.status != 0 }
    // })
    return this.cellTypeList.filter((v) => v.status == 0)
},

亮点是使用枚举来定义不同类型的字典接口

js 复制代码
enum DictType {
  NORMAL = 1,    // 普通字典
  INTEGER = 2,   // 整数字典
  PRODUCT = 3    // 产品类型字典
}
相关推荐
不停喝水2 分钟前
【前端转全栈java速通课】 项目实战④7-11节 操作数据库-登录-注册-修改密码-注销-mubatis-plus简化crud-
java·前端·数据库
一水鉴天1 小时前
统一对象拓扑(UOT)设计全链定稿:从三件事分离到三继承 之1 20261010(豆包“查看聊天内容”继续)
前端·css
杨杰3981 小时前
我给嵌入式设备写了个 6MB 的 JavaScript 运行时(xuan)
javascript
栖凤1 小时前
Java 的 try-catch 在 Agent 里失效了,我用了 5 个模式才兜住
java·前端·python
粥里有勺糖1 小时前
视野修炼第136期 | 前端小恐龙"Deno"被收购
前端·github·ai编程
修炼的dance1 小时前
页面塞了13.88 MB字体,导出的PDF只有71 KB
前端
qq_369173631 小时前
如何将 AI 生成的 HTML 网页发布成在线链接?不用自己搭建服务器
前端·人工智能·html·效率工具·html 发布
风花一世月1 小时前
⚡ 我把一座含氢能源园区搬进了浏览器(五类能流实时算守恒,在线直接玩)
前端·人工智能
羲云2 小时前
Claude 越界事件之后:Agent 权限设计为什么不能只靠提示词
前端
行者全栈架构师2 小时前
【鸿蒙心迹】鸿蒙网络请求架构实战——@ohos.net.http 到 Axios 封装、拦截器与统一错误处理(HarmonyOS 7.x)
前端·算法·架构