refactor: 获取字典的方法 提取公共函数 减少冗余代码

This commit is contained in:
dap 2024-12-13 15:41:20 +08:00
parent ccbc385bc8
commit 7ad45c897b

View File

@ -1,15 +1,22 @@
import type { DictData } from '#/api/system/dict/dict-data-model';
import { dictDataInfo } from '#/api/system/dict/dict-data'; import { dictDataInfo } from '#/api/system/dict/dict-data';
import { type Option, useDictStore } from '#/store/dict'; import { useDictStore } from '#/store/dict';
/**
*
* @param dictName
* @param dataGetter
* @returns
*/
function fetchAndCacheDictData<T>(
dictName: string,
dataGetter: () => T[],
): T[] {
const { dictRequestCache, setDictInfo } = useDictStore();
// 有调用方决定如何获取数据
const dataList = dataGetter();
// todo 重复代码的封装
export function getDict(dictName: string): DictData[] {
const { dictRequestCache, getDict, setDictInfo } = useDictStore();
// 这里拿到
const dictList = getDict(dictName);
// 检查请求状态缓存 // 检查请求状态缓存
if (dictList.length === 0 && !dictRequestCache.has(dictName)) { if (dataList.length === 0 && !dictRequestCache.has(dictName)) {
dictRequestCache.set( dictRequestCache.set(
dictName, dictName,
dictDataInfo(dictName) dictDataInfo(dictName)
@ -25,40 +32,31 @@ export function getDict(dictName: string): DictData[] {
* if一直进入逻辑导致接口无限刷新 * if一直进入逻辑导致接口无限刷新
* dictList为空时 * dictList为空时
*/ */
if (dictList.length > 0) { if (dataList.length > 0) {
dictRequestCache.delete(dictName); dictRequestCache.delete(dictName);
} }
}), }),
); );
} }
return dictList; return dataList;
} }
export function getDictOptions(dictName: string): Option[] { /**
const { dictRequestCache, getDictOptions, setDictInfo } = useDictStore(); * 使
const dictOptionList = getDictOptions(dictName); * @param dictName
// 检查请求状态缓存 * @returns
if (dictOptionList.length === 0 && !dictRequestCache.has(dictName)) { */
dictRequestCache.set( export function getDict(dictName: string) {
dictName, const { getDict } = useDictStore();
dictDataInfo(dictName) return fetchAndCacheDictData(dictName, () => getDict(dictName));
.then((resp) => { }
// 缓存到store 这样就不用重复获取了
// 内部处理了push的逻辑 这里不用push /**
setDictInfo(dictName, resp); * Select, Radio, Checkbox等组件使用
}) * @param dictName
.finally(() => { * @returns Options数组
// 移除请求状态缓存 */
/** export function getDictOptions(dictName: string) {
* item为空的情况( item本来就是错误用法) const { getDictOptions } = useDictStore();
* if一直进入逻辑导致接口五线刷新 return fetchAndCacheDictData(dictName, () => getDictOptions(dictName));
* dictList为空时
*/
if (dictOptionList.length > 0) {
dictRequestCache.delete(dictName);
}
}),
);
}
return dictOptionList;
} }