news 2026/10/15 19:31:25

✅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/10/15 0:28:41

核电站反应堆数字孪生 + 大模型:安全状态监测与风险预警技术

点赞、关注、收藏&#xff0c;不迷路 核电站反应堆作为核电装备的核心核心&#xff0c;是集高温高压、强放射性、多物理场耦合、运行工况复杂于一体的精密系统&#xff0c;其安全稳定运行直接关系到核电项目的生产安全与周边生态安全。传统反应堆安全状态监测与风险预警模式存在…

作者头像 李华
网站建设 2026/10/15 18:11:22

直流电机速度单闭环控制系统:Matlab/Simulink 仿真与实现

直流电机速度单闭环控制系统&#xff08;电机为传递函数建模&#xff09; matlab/simulink 仿真模型设计报告 在控制系统领域&#xff0c;直流电机的速度控制是一个经典且重要的课题。今天咱们就来讲讲基于传递函数建模的直流电机速度单闭环控制系统&#xff0c;并用 Matlab/S…

作者头像 李华
网站建设 2026/10/14 16:04:14

优化SEO效果的长尾关键词策略与应用分享

在优化SEO效果的长尾关键词策略中&#xff0c;内容概要扮演着引导读者理解的关键角色。通过对长尾关键词的分析与阐释&#xff0c;读者能够明确其重要性以及在实际应用中的具体策略。本段将概述长尾关键词如何在提高网站流量和排名方面发挥作用&#xff0c;并简要介绍选择与应用…

作者头像 李华
网站建设 2026/10/14 10:35:53

10410_基于Springboot的文化旅游宣传网站

1、项目包含项目源码、项目文档、数据库脚本、软件工具等资料&#xff1b;带你从零开始部署运行本套系统。2、项目介绍以甘南藏族自治州为例&#xff0c;其丰富的自然遗产与人文景观构成了独特的旅游生态体系&#xff0c;年接待游客量突破千万人次的背景下&#xff0c;旅游管理…

作者头像 李华
网站建设 2026/10/15 6:31:29

计算机毕业设计springboot高校师范生实习管理小程序 基于SpringBoot的高校师范生教育实习过程管理与协同平台 SpringBoot框架下的师范生教学实践移动化管理信息系统

计算机毕业设计springboot高校师范生实习管理小程序 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 在教育数字化转型持续深化的背景下&#xff0c;师范生教育实习作为连接理论…

作者头像 李华