news 2026/5/1 9:33:09

✅Vue代码整洁:从硬编码到数据字典映射

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
✅Vue代码整洁:从硬编码到数据字典映射

在长期维护中后台业务的过程中,我发现‘硬编码’的状态逻辑是导致代码劣化的主因。有了 local-dict 这个工具,不仅是为了简化模板中的条件判断,更是为了利用 TypeScript 的类型推导能力,为前端业务字典建立一套‘定义即类型,配置即驱动’的标准流,从而实现业务语义与工程逻辑的深度解耦。

在前端业务开发中,你是否经常被这种代码折磨:

  • 满屏魔术数字if (status === 1)—— 这个1到底是谁?
  • 反查 Label 靠手写list.find(i => i.val === v)?.label—— 逻辑重复,满屏undefined风险。
  • 重构如排雷:后端改了个状态值,你得全项目搜索字符串,生怕漏改一处导致事故。

1. 为什么不直接用 enum?

很多同学问:用原生的enum或者const Object不行吗?看下对比就知道了:

对比项原生 enum / Objectlocal-dict
Label 支持需手动维护额外 Map定义即绑定,一行获取
扩展属性难以挂载颜色、图标等 UI 属性原生支持,且具备完整的 IDE 类型提示
类型推导弱,需手动写断言强类型约束,支持自动推导联合类型
运行时能力转换 List 或反查逻辑繁琐高度集成,提供标准化的 API 调用

2. 适用场景

  • 业务状态字典:如订单状态、支付类型等。
  • 枚举 + UI 映射:状态与颜色、图标、国际化 Key 绑定。
  • 表单选项:快速生成 Select、Radio 的数据源。
  • 中后台系统:对代码健壮性和可维护性要求极高的项目。
  • 对 TS 类型质量有追求:不想在项目中到处写as any

3. 快速开始

1. 安装依赖
npm install local-dict
2. 创建字典
import { createLocalDict } from 'local-dict'; const STATUS = createLocalDict({ SUCCESS: { label: '成功', value: 1, type: 'success' }, FAIL: { label: '失败', value: 2, type: 'danger' }, UNKNOWN: { label: '未知', value: -1, type: 'info' } });

4. 用法

4.1 基础调用
// 获取原始 Value STATUS.SUCCESS.getValue(); // 1 // 获取展示 Label STATUS.SUCCESS.getLabel(); // '成功' // 获取条目在原始数组中的索引 STATUS.SUCCESS.getIndex(); // 0 // 将接口字段转换为中文 STATUS.getLabel4Value(status) // 具体label // 获取标准格式,适合 Select 或 Radio 组件。 STATUS.getList() // [{ label: '成功', value: 1, type: 'green' }, ...]
4.2 包含判断与类型收窄
// 如果status被命中,则status的类型会缩小为 STATUS.SUCCESS.getValue() | STATUS.FAIL.getValue() if (STATUS.includes(status, [STATUS.SUCCESS.getValue(), STATUS.FAIL.getValue()])) { // TODO } else {}
4.3 属性扩展:自定义业务字段
// 很多时候需要自定义字段,比如ui渲染为tag,每个状态对应不同的字体、背景颜色 // 获取 status 的的颜色 STATUS.getItemMap().get(status)?.type // success | danger | info | undefined

5. 实操(diff)

  1. 根据 row.status 渲染标签, 不再写一堆 v-if 判断
<el-table> <el-table-column label="状态"> <template #default="{ row }"> - <el-tag v-if="row.status === 1" type="success">成功</el-tag> - <el-tag v-else-if="row.status === 2" type="danger">失败</el-tag> - <el-tag v-else type="info">未知</el-tag> + <el-tag :type="STATUS.getItemMap().get(row.status)?.type"> + {{ STATUS.getLabel4Value(row.status) }} + </el-tag> </template> </el-table-column> </el-table>
  1. 获取列表渲染,适合 Select 或 Radio 组件的绑定数据
<el-select v-model="formData.status"> <el-option - v-for="item in options" + v-for="item in STATUS.getList()" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select>
  1. 操作按钮显隐

如果是多个状态都可以显示,不要使用 [STATUS.SUCCESS.getValue()].includes(row.status) 判断,需要使用STATUS.includes(row.status, [STATUS.SUCCESS.getValue()]), 因为 includes 类型收窄原因, 会导致 ts 报错

// 单个状态判断 <div> - <el-button v-if="row.status == 2" type="success">完成</el-button> + <el-button v-if="row.status == STATUS.SUCCESS.getValue()" type="success">完成</el-button> </div> // 多个状态判断 <div> - <el-button v-if="[1, 2].includes(row.status)" type="success">完成</el-button> + <el-button v-if="STATUS.includes(row.status, [STATUS.SUCCESS.getValue(), STATUS.FAIL.getValue()])" type="success">完成</el-button> </div>

6. 扩展

如果需要在type/interface申明字段类型,直接通过字面量/string | number ... 的方式是不好维护的,local-dict这个版本还没有实现,可以通过下面DictValues来推断value的联合类型。

import type { DictInstance, DictValueOf } from 'local-dict' type DictValues<S> = S extends DictInstance<infer T> ? DictValueOf<T> : never; //用法: interface Vo { status: DictValues<typeof STATUS>; // 1 | 2 | -1 }

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 8:35:43

Redisson分布式锁:从入门到实战

一、为什么需要分布式锁&#xff1f; 在单体应用中&#xff0c;我们使用Java的synchronized或ReentrantLock就能解决并发问题。但在微服务架构下&#xff0c;多个实例同时运行&#xff0c;单机的锁机制就失效了。这时就需要分布式锁来保证跨JVM的互斥访问。 分布式锁的核心需…

作者头像 李华
网站建设 2026/4/30 11:25:48

自动化测试步骤详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快本文通过介绍自动化测试基本步骤&#xff0c;并通过工具演示自动化测试中的接口自动化测试&#xff0c;来阐述自动化测试的应用流程。希望本文能帮助更多测试人员对…

作者头像 李华
网站建设 2026/5/1 8:01:58

FarsNews_1402年首六个月新闻数据集_10万条_波斯语_情感分析_多分类标注_完整新闻文本-波斯语自然语言处理、情感分析、新闻分类、话题建模-训练和评估波斯语文本理解模型-伊朗社会动态、舆论

FarsNews 1402年首六个月新闻数据集 引言与背景 FarsNews 1402年首六个月新闻数据集是一个包含102,564条波斯语新闻记录的综合性数据集&#xff0c;涵盖了伊朗法尔斯通讯社在1402年&#xff08;即2023年&#xff09;前六个月发布的全部新闻内容。该数据集不仅包含完整的新闻文…

作者头像 李华
网站建设 2026/5/1 8:31:56

轻松将文件从 iPhone 传输到 Mac

想把文件从 iPhone 传输到 Mac&#xff1f;这几乎是所有 iPhone 和 Mac 用户的常见任务。事实上&#xff0c;你可以轻松地将 iPhone 文件传输到 Mac。学习本指南中的 6 种有效方法&#xff0c;你将掌握所有步骤&#xff0c;轻松传输文件。 快速浏览一下这 6 种方法&#xff1a;…

作者头像 李华