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

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

完整的代码

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    // 产品类型字典
}
相关推荐
阿虎儿8 分钟前
React Context 详解:从入门到性能优化
前端·vue.js·react.js
颜酱31 分钟前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
Sailing32 分钟前
🚀 别再乱写 16px 了!CSS 单位体系已经进入“计算时代”,真正的响应式布局
前端·css·面试
FansUnion1 小时前
我如何用 Next.js + Supabase + Cloudflare R2 搭建壁纸销售平台——月成本接近 $0
javascript
喝水的长颈鹿1 小时前
【大白话前端 03】Web 标准与最佳实践
前端
爱泡脚的鸡腿1 小时前
Node.js 拓展
前端·后端
左夕2 小时前
分不清apply,bind,call?看这篇文章就够了
前端·javascript
Zha0Zhun3 小时前
一个使用ViewBinding封装的Dialog
前端
兆子龙3 小时前
从微信小程序 data-id 到 React 列表性能优化:少用闭包,多用 data-*
前端
滕青山3 小时前
文本行过滤/筛选 在线工具核心JS实现
前端·javascript·vue.js