admin-vben5/apps/web-antd/src/utils/dict.ts

65 lines
2.2 KiB
TypeScript

import type { DictData } from '#/api/system/dict/dict-data-model';
import { dictDataInfo } from '#/api/system/dict/dict-data';
import { type Option, useDictStore } from '#/store/dict';
// todo 重复代码的封装
export function getDict(dictName: string): DictData[] {
const { dictRequestCache, getDict, setDictInfo } = useDictStore();
// 这里拿到
const dictList = getDict(dictName);
// 检查请求状态缓存
if (dictList.length === 0 && !dictRequestCache.has(dictName)) {
dictRequestCache.set(
dictName,
dictDataInfo(dictName)
.then((resp) => {
// 缓存到store 这样就不用重复获取了
// 内部处理了push的逻辑 这里不用push
setDictInfo(dictName, resp);
})
.finally(() => {
// 移除请求状态缓存
/**
* 这里主要判断字典item为空的情况(无奈兼容 不给字典item本来就是错误用法)
* 会导致if一直进入逻辑导致接口无限刷新
* 在这里dictList为空时 不删除缓存
*/
if (dictList.length > 0) {
dictRequestCache.delete(dictName);
}
}),
);
}
return dictList;
}
export function getDictOptions(dictName: string): Option[] {
const { dictRequestCache, getDictOptions, setDictInfo } = useDictStore();
const dictOptionList = getDictOptions(dictName);
// 检查请求状态缓存
if (dictOptionList.length === 0 && !dictRequestCache.has(dictName)) {
dictRequestCache.set(
dictName,
dictDataInfo(dictName)
.then((resp) => {
// 缓存到store 这样就不用重复获取了
// 内部处理了push的逻辑 这里不用push
setDictInfo(dictName, resp);
})
.finally(() => {
// 移除请求状态缓存
/**
* 这里主要判断字典item为空的情况(无奈兼容 不给字典item本来就是错误用法)
* 会导致if一直进入逻辑导致接口五线刷新
* 在这里dictList为空时 不删除缓存
*/
if (dictOptionList.length > 0) {
dictRequestCache.delete(dictName);
}
}),
);
}
return dictOptionList;
}