Skip to content

Dict 字典 ​

简介 ​

用一份声明统一「表单选项、表格标签、详情文案」,避免状态文案和颜色散落在各处。字典可以同步注册,也可以异步拉取,全局共享且只加载一次。

代码演示 ​

基础使用 ​

用法 ​

注册 ​

在 launch 里集中配置,值支持数组、对象、以及返回它们的(异步)函数:

ts
import { launch } from 'cosey';

launch(app, {
  dict: {
    // 需要多语言时用 labelKey(key 来自项目自己的语言包)
    user_status: [
      { value: 1, labelKey: 'user.status.enabled', color: 'success' },
      { value: 0, labelKey: 'user.status.disabled', color: 'info' },
    ],
    // 固定文案用 label
    audit_status: [
      { value: 1, label: '已通过', color: 'success' },
      { value: 0, label: '已驳回', color: 'danger' },
    ],
    // 对象形式
    yes_no: { 1: '是', 0: '否' },
    // 异步
    dept: () => getDeptOptions(),
  },
});

也可以运行时注册,后注册的会覆盖同名项:

ts
import { registerDicts } from 'cosey';

registerDicts({ user_status: [...] });

对象形式的键是字符串,且数字键会被 JavaScript 按升序重排。需要严格控制顺序时请用数组形式。

多语言 ​

labelKey 是 i18n 的 key,优先于 label,渲染时按当前语言翻译;切换语言会自动更新,不需要重新加载字典。label 与 labelKey 可以在同一个字典里混用。

解析顺序:

  1. 应用自己的词条 — launch({ i18n: { messages: [{ value: 'zh-cn', app: {...} }] } }) 里配的 key
  2. 框架内置词条 — co.* 命名空间,跟随框架语言包切换
  3. 两条都没命中时返回 key 本身,便于发现漏配
ts
// 项目语言包里:{ user: { status: { enabled: '启用' } } }
{
  value: 1,
  labelKey: 'user.status.enabled',
}

应用词条走 vue-i18n 实例,所以 labelKey 可以复用项目已有的翻译文件;co.* 只是框架自带的兜底,不需要在项目语言包里重复定义。

字典名的类型提示 ​

useDict('...') 与 <co-dict-tag dict="..."> 的字典名走 DictName,默认是 string。在项目的 d.ts 里扩展 DictNameMap 后就能获得补全:

ts
declare module 'cosey' {
  interface DictNameMap {
    user_status: true;
    audit_status: true;
  }
}

扩展后写成未声明的字典名不会报错(仍是 LiteralUnion),只是不会被补全,方便后端临时下发新字典。

取值 ​

ts
import { useDict } from 'cosey';

const { options, getLabel, getColor, getItem, loading, reload } = useDict('user_status');

getLabel(1); // '启用'(labelKey 按当前语言翻译,值是语言包里的文案)
getColor(1); // 'success'

options 可直接作为 co-field 的 options 使用:

vue
<co-form-item field-type="select" :field-props="{ options }" />

API ​

useDict ​

参数 / 返回值描述类型
name字典名,支持 ref / getterMaybeRefOrGetter<DictName>
items字典项Ref<DictItem[]>
optionsitems 的别名Ref<DictItem[]>
loading是否加载中Ref<boolean>
error加载错误Ref<any>
getItem取字典项(value: any) => DictItem
getLabel取文案(labelKey 会翻译),找不到时回退到 fallback 或原值(value: any, fallback?: string) => string
getTextgetLabel 的语义化别名(value: any, fallback?: string) => string
getColor取颜色(value: any) => string
reload重新加载() => Promise<void>

DictItem ​

字段描述类型
label固定文案;需要多语言时改用 labelKeystring
labelKeyi18n key,优先于 label,随语言切换string
value值string | number
color标签颜色:success / warning / danger / info / primarystring
disabled是否禁用boolean

DictTagProps ​

属性描述类型默认值
dict字典名DictName-
value当前值string | number | boolean-
options直接传字典项,优先级高于 dictDictItem[]-
type覆盖颜色string-
size尺寸'large' | 'default' | 'small'-
effect主题'dark' | 'light' | 'plain'-
fallback找不到字典项时的文案,默认回退到原值string-

DictTagSlots ​

插槽描述属性
default自定义内容

基于 MIT 许可发布