news 2026/4/7 17:15:34

✅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/3/16 15:30:41

软件测试中的白盒测试,这些技巧你知道吗?

对于很多刚开始学习软件测试的小伙伴来说&#xff0c;如果能尽早将黑盒、白盒测试弄明白&#xff0c;掌握两种测试的结论和基本原理&#xff0c;将对自己后期的学习有较好的帮助。今天&#xff0c;我们就来聊聊黑盒、白盒测试的相关话题。 1、黑盒测试的方法和小结 最常见黑盒…

作者头像 李华
网站建设 2026/4/3 20:06:14

中专学历转行本地电商数据分析的可行性分析

行业背景与需求 本地电商行业近年来快速发展&#xff0c;数据驱动决策成为核心竞争力。企业对数据分析人才的需求持续增长&#xff0c;尤其是能够结合本地市场特点进行精准分析的专业人员。 本地电商数据分析岗位需求技能要求薪资范围&#xff08;初级&#xff09;销售数据分…

作者头像 李华
网站建设 2026/3/26 9:59:17

大专学历出纳转型财务BP的路径规划

财务BP&#xff08;Business Partner&#xff09;是企业财务与业务深度融合的岗位&#xff0c;需具备数据分析、业务洞察和战略支持能力。以下从技能提升、证书考取、实战经验等维度&#xff0c;为出纳转型财务BP提供具体方案。 核心能力对比分析 出纳岗位能力财务BP岗位能力提…

作者头像 李华
网站建设 2026/4/5 12:27:47

pytest实战技巧之参数化应用

pytest是Python中最流行的测试框架之一。它提供了丰富的功能&#xff0c;可以帮助我们编写高效、可靠的测试用例。其中一个重要的功能就是参数化&#xff0c;它可以让我们用不同的数据组合来运行同一个测试用例&#xff0c;从而 提高测试覆盖率和效率。本文将介绍pytest参数化的…

作者头像 李华
网站建设 2026/3/27 4:07:26

基于单片机的数显照度计的设计

基于单片机的数显照度计的设计 一、设计背景与意义 在工业生产、农业种植、建筑照明、科研实验等领域&#xff0c;光照强度是影响生产效率、产品质量与实验精度的关键环境参数。传统照度计多采用模拟电路设计&#xff0c;存在测量精度低、读数误差大、操作繁琐等问题&#xff0…

作者头像 李华
网站建设 2026/4/3 4:14:07

一款带空间音效的蓝牙耳机如何定义沉浸听感与音质体验?

2025年,倍思与音频巨头Bose携手推出Inspire系列耳机,正式进军高端市场。该系列作为其“专业音频大众化”理念的落地实践,以旗舰级配置,迅速成为广大用户关注的焦点。尤其在消费者重点关注的空间音效维度,其表现卓越。正如系列代表型号之一Inspire XH1,便是一款能够带来深度沉浸…

作者头像 李华