基于 Vue3 和 Element Plus 的 <el-tag> 二次封装实现数字字典标签展示

在前端项目中,我们常常会接收到一些数字状态码(如 0、1、2 等),这些数字在业务语义上通常代表某种状态。为了让页面更直观、可读,我们往往需要将这些数字转换成对应的"标签"文字,并配以颜色样式显示出来,这也就是数字字典组件的使用场景。

本文将基于 Vue3 + Element Plus ,通过对 <el-tag> 的二次封装,完成一个支持数字字典的状态标签组件(仅前端部分)。

1、定义 dictType 类型结构

我们首先定义 el-tag 所支持的所有配置项,便于后续统一控制:

css 复制代码
interface dictType {
  label: string;
  value: number | null;
  type: 'primary' | 'success' | 'info' | 'warning' | 'danger';
  closable: boolean;
  hit: boolean;
  color: string;
  size: 'large' | 'default' | 'small';
  effect: 'dark' | 'light' | 'plain';
  round: boolean;
}

2、创建组件并设置默认值

接着我们使用 reactive 定义组件的默认属性:

yaml 复制代码
const defaultData = reactive<dictType>({
  label: '',
  value: null,
  type: 'primary',
  closable: false,
  hit: false,
  color: '',
  size: 'default',
  effect: 'light',
  round: false
});

3、模拟字典数据并匹配值

实际开发中,data 通常来自后端接口,这里使用模拟数据进行演示:

go 复制代码
const data = [
  { label: '使用中', value: 2, type: 'primary' },
  { label: '空闲中', value: 3, type: 'success' },
  { label: '维护中', value: 4, type: 'warning' },
  { label: '待维修', value: 5, type: 'danger' }
];

为组件传入的 value 设置 props,且为必传项:

php 复制代码
const props = defineProps({
  value: {
    type: Number,
    required: true
  }
});

这里的写法也可以为

ini 复制代码
const props = defineProps({
    value: Number
})

接着定义匹配函数(此处用模拟数据):

ini 复制代码
const getDict = () => {
  const item = data.find((item) => item.value === props.value);
  if (item) Object.assign(defaultData, item);
};

使用 Object.assign() 可保留响应式,批量更新字段。

在 onMounted() 中执行一次:

scss 复制代码
onMounted(() => {
  getDict();
});

组件模板部分

ini 复制代码
<template>
  <el-tag
    :type="defaultData.type"
    :closable="defaultData.closable"
    :hit="defaultData.hit"
    :color="defaultData.color"
    :size="defaultData.size"
    :effect="defaultData.effect"
    :round="defaultData.round"
  >
    {{ defaultData.label }}
  </el-tag>
</template>

使用方式示例

ini 复制代码
<DictTag :value="scope.row.status" />

效果展示

欢迎大家留言探讨你们的实践经验,如有疏漏或不妥之处,欢迎在评论区指出,互相学习,共同进步!

相关推荐
福兮说6 小时前
前端下载大文件,点了按钮半天没反应:fetch + blob 的三个问题和三种替代写法
前端·javascript·性能优化·文件下载
GreenTea6 小时前
我把 Agent 的 while 循环拆掉了:一种你可能没想到的 Agent 架构
前端·后端·架构
科技观察哨6 小时前
六足平台选型与纳米定位系统集成:HEB-640六自由度位移台在半导体光刻对准中的参数边界与国产替代评估
前端·人工智能
niucloud-admin6 小时前
JAVA V6 多商户商城 开发文档——web前端
前端
颜进强7 小时前
16 · NestJS LifecycleEvents 生命周期事件:五个钩子、三条边界,和 rag-server 的优雅停机
前端·后端·ai编程
今年下半年8 小时前
【VUE】整合腾讯地图、自定义区域边界、村委名称及资产统计(放大显示资产点位)
前端·javascript·vue.js
郑州光合科技余经理8 小时前
同城电商系统:库存变更怎么同步到订单
java·开发语言·前端·后端·uni-app·php·ai编程
前端snow10 小时前
ai agent --- DeepAgents 中间件
前端
data analyse 45611 小时前
报表能自定义的国内统计工具有哪些
前端·数据分析