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

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

本文将基于 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" />

效果展示

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

相关推荐
代码搬运媛5 小时前
Jest 测试框架详解与实现指南
前端
counterxing6 小时前
我把 Codex 里的 Skills 做成了一个 MCP,还支持分享
前端·agent·ai编程
wangqiaowq6 小时前
windows下nginx的安装
linux·服务器·前端
之歆7 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
发现一只大呆瓜7 小时前
Vite凭什么这么快?3分钟带你彻底搞懂 Vite 热更新的幕后黑手
前端·面试·vite
Maimai108087 小时前
React如何用 @microsoft/fetch-event-source 落地 SSE:比原生 EventSource 更灵活的实时推送方案
前端·javascript·react.js·microsoft·前端框架·reactjs·webassembly
kyriewen9 小时前
产品经理把PRD写成“天书”,我用AI半小时重写了一遍,他当场愣住
前端·ai编程·cursor
humcomm9 小时前
元框架的工作原理详解
前端·前端框架
canonical_entropy9 小时前
Attractor Before Harness: AI 大规模开发的方法论
前端·aigc·ai编程
zhangxingchao10 小时前
多 Agent 架构到底怎么选?从 Claude Agent Teams、Cognition/Devin 到工程落地原则
前端·人工智能·后端