# ldesign-dict
**Repository Path**: ldesign-v1/ldesign-dict
## Basic Information
- **Project Name**: ldesign-dict
- **Description**: LDesign ?????? - Data dictionary management
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-03-13
- **Last Updated**: 2026-04-08
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# @ldesign/dict
数据字典管理库,支持静态注册、远程加载、TTL 缓存、并发去重和响应式 Vue 3 集成。
## 功能特性
- **统一字典管理** — 通过字典编码(code)统一管理各类数据字典
- **多数据源** — 支持静态配置和远程加载两种数据源
- **TTL 缓存** — 可配置缓存过期时间,默认 5 分钟
- **并发去重** — 同一编码的并发请求自动合并
- **UI 组件** — 提供下拉选择框、单选框、复选框组件
- **Vue 3 集成** — useDict、useDictLabel 响应式 composable
- **事件系统** — 监听注册、加载、缓存过期等事件
## 安装
```bash
npm install @ldesign/dict
```
## 快速开始
### 核心库使用
```typescript
import { DictManager, DictSelect, DictRadio, DictCheckbox } from '@ldesign/dict-core'
// 创建字典管理器
const manager = new DictManager({
fetcher: async (code) => {
const res = await fetch(`/api/dict/${code}`)
return res.json()
},
cacheTTL: 10 * 60 * 1000, // 10 分钟
dicts: [
{
code: 'gender',
items: [
{ value: 1, label: '男' },
{ value: 2, label: '女' },
],
},
{
code: 'status',
items: [
{ value: 'active', label: '启用' },
{ value: 'inactive', label: '禁用' },
],
cacheTTL: 60000, // 单独配置 1 分钟
},
],
})
// 获取字典(优先缓存,否则远程加载)
const genderItems = await manager.get('gender')
// [{ value: 1, label: '男' }, { value: 2, label: '女' }]
// 同步获取(仅缓存命中时返回)
const cached = manager.getSync('gender') // readonly
// 根据 value 查找 label
manager.getLabel('gender', 1) // '男'
// 根据 value 获取完整字典项
manager.getItem('gender', 1) // { value: 1, label: '男' }
// 检查字典是否存在
manager.has('gender') // true
// 获取所有字典编码
manager.getCodes() // ['gender', 'status']
// 强制刷新(清除缓存并重新加载)
const fresh = await manager.refresh('gender')
// 清除缓存
manager.clearCache('gender') // 清除单个
manager.clearCache() // 清除全部
// 设置远程获取函数
manager.setFetcher(async (code) => {
const res = await fetch(`/api/v2/dict/${code}`)
return res.json()
})
// 事件监听
manager.on('register', (config) => console.log('注册:', config.code))
manager.on('loaded', (code, items) => console.log('加载:', code, items.length))
manager.on('cacheExpire', (code) => console.log('过期:', code))
manager.on('error', (err) => console.error('错误:', err))
```
### UI 组件
```typescript
import { DictSelect, DictRadio, DictCheckbox } from '@ldesign/dict-core'
// 下拉选择框
const select = new DictSelect({
container: '#select-container',
code: 'gender',
placeholder: '请选择性别',
clearable: true,
onChange: (value, item) => {
console.log('选择:', value, item?.label)
},
})
select.setItems(await manager.get('gender'))
select.setValue(1)
select.getValue() // 1
select.destroy()
// 单选框
const radio = new DictRadio({
container: '#radio-container',
code: 'status',
value: 'active',
onChange: (value, item) => console.log(value, item),
})
radio.setItems(statusItems)
// 复选框
const checkbox = new DictCheckbox({
container: '#checkbox-container',
code: 'permissions',
value: ['read', 'write'],
onChange: (values, items) => console.log(values, items),
})
checkbox.setItems(permissionsItems)
checkbox.getValue() // ['read', 'write']
```
### Vue 3 使用
```vue
加载中...
错误: {{ error.message }}
当前选择: {{ label }}
```
### Vue 插件
```typescript
import { createDictPlugin } from '@ldesign/dict-vue'
app.use(createDictPlugin({
fetcher: async (code) => {
const res = await fetch(`/api/dict/${code}`)
return res.json()
},
cacheTTL: 10 * 60 * 1000,
dicts: [
{
code: 'gender',
items: [
{ value: 1, label: '男' },
{ value: 2, label: '女' },
],
},
],
}))
```
## API 文档
### DictManager
| 方法 | 说明 |
|------|------|
| `register(config)` | 注册静态字典 |
| `get(code)` | 获取字典项(异步,优先缓存否则远程加载) |
| `getSync(code)` | 同步获取(仅缓存命中时返回,冻结副本) |
| `getLabel(code, value)` | 根据 value 查找 label |
| `getItem(code, value)` | 根据 value 获取完整字典项 |
| `has(code)` | 检查字典是否存在 |
| `getCodes()` | 获取所有已注册的字典编码 |
| `refresh(code)` | 强制刷新(清除缓存并重新加载) |
| `clearCache(code?)` | 清除缓存 |
| `setFetcher(fetcher)` | 设置远程获取函数 |
| `on(event, listener)` | 添加事件监听器 |
| `off(event, listener)` | 移除事件监听器 |
### DictItem
```typescript
interface DictItem {
value: V // 字典值
label: string // 显示标签
disabled?: boolean // 是否禁用
sort?: number // 排序权重
extra?: Record // 附加数据
children?: DictItem[] // 子级(树形字典)
}
```
## License
MIT