vue3 封装一个在el-table中回显字典的组件

vue3 封装一个在el-table中回显字典的组件

  • MyDictTag.vue
html 复制代码
<template>
  <el-tag :type="tagType" :effect="effect">
    {{ displayText }}
  </el-tag>
</template>

<script setup>
import { computed } from 'vue';

const props = defineProps({
  // 字典值
  value: {
    type: [String, Number],
    required: true,
  },
  // 字典数据
  dictData: {
    type: [Array, Object],
    default: () => [],
  },
  // 未匹配时的默认显示
  emptyText: {
    type: String,
    default: '-',
  },
  //主题:dark、light 和 plain。
  effect: {
    type: String,
    default: 'light',
  },
});

const displayText = computed(() => {
  if (props.value == null || props.value === '') {
    return props.emptyText;
  }

  const val = String(props.value);

  // 情况1:dict 是对象 { '1': '男', '2': '女' }
  if (typeof props.dictData === 'object' && !Array.isArray(props.dictData)) {
    return props.dictData[val] ?? props.emptyText;
  }

  // 情况2:dict 是数组 [{ value: '1', label: '男' }, ...]
  if (Array.isArray(props.dictData)) {
    const item = props.dictData.find((d) => String(d.value) === val);
    return item ? item.label : props.emptyText;
  }

  return props.emptyText;
});

const tagType = computed(() => {
  const successList = ['已批准', '已提交', '进行中', '已归档', '已通过', '已审批', '借阅中', '男', '公告'];
  const dangerList = ['已拒绝', '已取消', '已驳回', '已禁用', '停用', '否', '删除', '失败'];
  const warningList = ['待审核', '待处理', '待确认', '待反馈', '待评价', '待归档', '待开始', '待审批', '女', '通知', '导入'];
  const infoList = ['已完成', '已删除', '已审核', '已归还', '已关闭', '修改'];

  if (successList.includes(displayText.value)) {
    return 'success';
  } else if (dangerList.includes(displayText.value)) {
    return 'danger';
  } else if (warningList.includes(displayText.value)) {
    return 'warning';
  } else if (infoList.includes(displayText.value)) {
    return 'info';
  } else {
    return 'primary';
  }
});
</script>
  • 使用
html 复制代码
 <MyDictTag value="0" :dictData="[
                { label: '待审核', value: '0' },
                { label: '已批准', value: '1' },
              ]"
/>
相关推荐
小兵张健3 分钟前
价值1000的 AI 工作流:Codex 通用前端协作模式
前端·aigc·ai编程
sunny_12 分钟前
面试踩大坑!同一段 Node.js 代码,CJS 和 ESM 的执行顺序居然是反的?!99% 的人都答错了
前端·面试·node.js
拉不动的猪25 分钟前
移动端调试工具VConsole初始化时的加载阻塞问题
前端·javascript·微信小程序
ayqy贾杰2 小时前
Agent First Engineering
前端·vue.js·面试
IT_陈寒2 小时前
SpringBoot实战:5个让你的API性能翻倍的隐藏技巧
前端·人工智能·后端
iceiceiceice3 小时前
iOS PDF阅读器段评实现:如何从 PDFSelection 精准还原一个自然段
前端·人工智能·ios
大金乄3 小时前
封装一个vue2的elementUI 表格组件(包含表格编辑以及多级表头)
前端·javascript
葡萄城技术团队4 小时前
【性能优化篇】面对万行数据也不卡顿?揭秘协同服务器的“片段机制 (Fragments)”
前端
程序员阿峰4 小时前
2026前端必备:TensorFlow.js,浏览器里的AI引擎,不写Python也能玩转智能
前端
Jans4 小时前
Shipfe — Rust 写的前端静态部署工具:一条命令上线 + 零停机 + 可回滚 + 自动清理
前端