Skip to content

全局字典 useDict ​

useDict(dictType) 全局字典 hook:app 级注入一次加载器,各页面按字典类型取数(同类型多处使用共享一次请求),getLabel(value) 做 value → label 回显。与 BizStatusTag 的 dict-type 通道、BizFilterTags 的条件回显共用同一份字典数据,是「一套状态字典 N 个页面复用」的请求层答案。

接入三步 ​

ts
// 1. main.ts:登录态就绪后注入字典加载器(业务接口在业务侧)
import { configureBizDict } from 'vue3-ep-biz-lib'

configureBizDict(async (dictType) => {
  const res = await fetch(`/api/dicts/${dictType}`)
  const data = (await res.json()) as Array<{ value: number; label: string }>
  return data // → BizDictItem[]
})
vue
<!-- 2. 页面内取用 -->
<script setup lang="ts">
import { useDict } from 'vue3-ep-biz-lib'

const { items, loading, getLabel } = useDict('order_status')
</script>

<template>
  <!-- 3. 下拉用 items,列表回显用 getLabel -->
  <ElSelect v-model="status">
    <ElOption v-for="item in items" :key="item.value" :value="item.value" :label="item.label" />
  </ElSelect>
  <span>{{ getLabel(row.status) }}</span>
</template>

API ​

名称说明
configureBizDict(loader)注入字典加载器((dictType) => Promise<BizDictItem[]>);未注入时 useDict 返回空列表不报错
useDict(dictType)取字典:items / loading / loaded / getLabel(value, fallback?) / getItem(value) / refresh()
clearBizDictCache(type?)清缓存(字典热更新 / 退出登录);不传清全部
BizDictItem{ value, label, [key: string]: unknown }——扩展字段(type / color)供 BizStatusTag 等消费

行为要点 ​

  • 共享缓存:同 dictType 多处 useDict 只发一次请求(模块级缓存);
  • 失败不缓存:加载失败下次调用自动重试;
  • 强制刷新:refresh() 绕过缓存重拉;
  • 响应式回显:getLabel 内部读取响应式 items,字典到位后模板自动更新。

与状态标签联动 ​

BizStatusTag(状态标签)内置 dict-type 通道直接消费全局字典,页面内无需经 useDict 桥接:

vue
<template>
  <!-- dict-type 直接驱动:同类型共享缓存,字典项 type 色系 / color 实色自动渲染 -->
  <BizStatusTag dict-type="order_status" :status="row.status" />
</template>

页面有私有码值时叠加 status-map 兜底(字典优先、映射补充):

vue
<template>
  <BizStatusTag dict-type="order_status" :status-map="PRIVATE_STATUS" :status="row.status" />
</template>

下拉筛选、条件回显等列表场景仍用 useDict 取 items / getLabel。详见《BizStatusTag 状态标签》。