|
|
@@ -2,16 +2,41 @@ import { defineStore } from 'pinia';
|
|
|
import { ref } from 'vue';
|
|
|
import { getAllDataDictList as getList } from '@/api';
|
|
|
|
|
|
-export const useDataDictStore = defineStore('dataDict', () => {
|
|
|
- const dataDict = ref([]);
|
|
|
- const map = new Map();
|
|
|
+export const useDataDictStore = defineStore('dataDict', () => {
|
|
|
+ const dataDict = ref([]);
|
|
|
+ const map = new Map();
|
|
|
+ let isLoaded = false;
|
|
|
+ let loadingPromise = null;
|
|
|
|
|
|
- /**
|
|
|
- * 加载数据字典
|
|
|
- */
|
|
|
- const loadDataDictList = async () => {
|
|
|
- dataDict.value = (await getList()).data;
|
|
|
- };
|
|
|
+ /**
|
|
|
+ * 加载数据字典
|
|
|
+ */
|
|
|
+ const loadDataDictList = async () => {
|
|
|
+ if (isLoaded) {
|
|
|
+ return dataDict.value;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 应用启动和页面初始化可能同时触发,复用同一个请求,避免重复加载。
|
|
|
+ if (loadingPromise) {
|
|
|
+ return loadingPromise;
|
|
|
+ }
|
|
|
+
|
|
|
+ loadingPromise = getList()
|
|
|
+ .then(response => {
|
|
|
+ if (Array.isArray(response?.data)) {
|
|
|
+ dataDict.value = response.data;
|
|
|
+ map.clear();
|
|
|
+ isLoaded = true;
|
|
|
+ }
|
|
|
+ return dataDict.value;
|
|
|
+ })
|
|
|
+ .catch(() => dataDict.value)
|
|
|
+ .finally(() => {
|
|
|
+ loadingPromise = null;
|
|
|
+ });
|
|
|
+
|
|
|
+ return loadingPromise;
|
|
|
+ };
|
|
|
/**
|
|
|
* 获取type对应字典列表
|
|
|
* @param type
|