Appearance
全局字典 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 状态标签》。