yuang-framework-ui-common 1.0.112 → 1.0.113

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,50 +1,64 @@
1
- // 首先建议创建类型定义文件(如 types/api.d.ts),或直接在当前文件定义类型
2
- // 定义接口:枚举列表项的类型
1
+ import { ref } from 'vue';
2
+ import { http } from '../../../lib/config/httpConfig';
3
+
3
4
  export interface StatusEnumItem {
4
- // 根据实际返回的字段补充类型,比如:
5
5
  value: string;
6
6
  name: string;
7
- // 兼容对象中未显式定义的任意字段,避免 TS 报错
8
7
  [key: string]: any;
9
8
  }
10
9
 
11
- import { ref } from 'vue';
12
- import { http } from '../../../lib/config/httpConfig';
10
+ // 全局唯一 KEY
11
+ const CACHE_KEY = '__global_status_enum_list__';
12
+
13
+ // 全局单例(只会初始化一次)
14
+ if (!(window as any)[CACHE_KEY]) {
15
+ (window as any)[CACHE_KEY] = {
16
+ data: ref<StatusEnumItem[]>([]),
17
+ loading: ref(false),
18
+ isLoaded: false, // 🔥 核心:标记是否【真正加载完成】
19
+ promise: null as Promise<any> | null,
20
+ };
21
+ }
22
+
23
+ const cache = (window as any)[CACHE_KEY];
13
24
 
14
- /**
15
- * 提供“获取状态枚举列表”的能力
16
- *
17
- * Vue3 官方明确规定,组合式函数必须以 use 开头(参考:Vue3 组合式函数文档),目的是让开发者一眼识别:“这是一个可复用的组合式逻辑,返回响应式能力”
18
- */
19
25
  export const useStatusEnumList = () => {
20
- // 定义响应式数据,指定类型
21
- const statusEnumList = ref<StatusEnumItem[]>([]);
22
- // 定义加载状态(可选,增强体验)
23
- const isLoadingEnum = ref<boolean>(false);
24
-
25
- /**
26
- * 获取状态枚举列表的核心方法
27
- */
28
- const getStatusEnumList = async (): Promise<void> => {
26
+ const getStatusEnumList = async () => {
27
+ // 1. 已经加载完成 → 直接返回
28
+ if (cache.isLoaded) {
29
+ return cache.data.value;
30
+ }
31
+
32
+ // 2. 正在请求中 → 等待同一个请求
33
+ if (cache.promise) {
34
+ await cache.promise;
35
+ return cache.data.value;
36
+ }
37
+
38
+ // 3. 真正开始请求
39
+ cache.loading.value = true;
40
+ cache.promise = http.get('/framework-api/union/uims-user/getStatusEnumList', {});
41
+
29
42
  try {
30
- isLoadingEnum.value = true;
31
- // 指定响应数据类型,TS会自动校验
32
- const res = await http.get('/framework-api/union/framework-data/getStatusEnumList', {});
33
- statusEnumList.value = res.data.data;
34
- } catch (ex) {
35
- console.error('获取状态枚举列表失败:', ex);
36
- statusEnumList.value = [];
43
+ const res = await cache.promise;
44
+ cache.data.value = res.data.data || [];
45
+ cache.isLoaded = true; // 🔥 永久标记:已加载完成!
46
+ } catch (err) {
47
+ console.error('加载枚举失败', err);
48
+ cache.data.value = [];
37
49
  } finally {
38
- isLoadingEnum.value = false;
50
+ cache.loading.value = false;
51
+ cache.promise = null;
39
52
  }
53
+
54
+ return cache.data.value;
40
55
  };
41
56
 
42
- // 初始化调用(可选,也可由外部调用)
57
+ // 自动加载
43
58
  getStatusEnumList();
44
59
 
45
- // 返回响应式数据和方法,供组件使用
46
60
  return {
47
- statusEnumList,
48
- isLoadingEnum
61
+ statusEnumList: cache.data,
62
+ isLoadingEnum: cache.loading,
49
63
  };
50
64
  };
@@ -1,61 +1,50 @@
1
- import { ref } from 'vue';
2
- import { http } from '../../../lib/config/httpConfig';
3
-
1
+ // 首先建议创建类型定义文件(如 types/api.d.ts),或直接在当前文件定义类型
2
+ // 定义接口:枚举列表项的类型
4
3
  export interface StatusEnumItem {
4
+ // 根据实际返回的字段补充类型,比如:
5
5
  value: string;
6
6
  name: string;
7
+ // 兼容对象中未显式定义的任意字段,避免 TS 报错
7
8
  [key: string]: any;
8
9
  }
9
10
 
10
- // 全局唯一 KEY
11
- const ENUM_CACHE_KEY = '__global_status_enum_list__';
12
-
13
- // 初始化全局单例(只会执行一次)
14
- if (!(window as any)[ENUM_CACHE_KEY]) {
15
- (window as any)[ENUM_CACHE_KEY] = {
16
- data: ref<StatusEnumItem[]>([]),
17
- loading: ref(false),
18
- promise: null as Promise<any> | null, // 🔥 核心:锁并发
19
- };
20
- }
21
-
22
- const cache = (window as any)[ENUM_CACHE_KEY];
11
+ import { ref } from 'vue';
12
+ import { http } from '../../../lib/config/httpConfig';
23
13
 
14
+ /**
15
+ * 提供“获取状态枚举列表”的能力
16
+ *
17
+ * Vue3 官方明确规定,组合式函数必须以 use 开头(参考:Vue3 组合式函数文档),目的是让开发者一眼识别:“这是一个可复用的组合式逻辑,返回响应式能力”
18
+ */
24
19
  export const useStatusEnumList = () => {
25
- const getStatusEnumList = async () => {
26
- // 1. 已经有数据 → 直接返回
27
- if (cache.data.value.length > 0) {
28
- return cache.data.value;
29
- }
30
-
31
- // 2. 正在请求 → 等待同一个 promise(防并发)
32
- if (cache.promise) {
33
- await cache.promise;
34
- return cache.data.value;
35
- }
36
-
37
- // 3. 真正发起请求
38
- cache.loading.value = true;
39
- cache.promise = http.get('/framework-api/union/uims-user/getStatusEnumList', {});
40
-
20
+ // 定义响应式数据,指定类型
21
+ const statusEnumList = ref<StatusEnumItem[]>([]);
22
+ // 定义加载状态(可选,增强体验)
23
+ const isLoadingEnum = ref<boolean>(false);
24
+
25
+ /**
26
+ * 获取状态枚举列表的核心方法
27
+ */
28
+ const getStatusEnumList = async (): Promise<void> => {
41
29
  try {
42
- const res = await cache.promise;
43
- cache.data.value = res.data.data || [];
44
- } catch (err) {
45
- console.error('加载枚举失败', err);
46
- cache.data.value = [];
30
+ isLoadingEnum.value = true;
31
+ // 指定响应数据类型,TS会自动校验
32
+ const res = await http.get('/framework-api/union/uims-user/getStatusEnumList', {});
33
+ statusEnumList.value = res.data.data;
34
+ } catch (ex) {
35
+ console.error('获取状态枚举列表失败:', ex);
36
+ statusEnumList.value = [];
47
37
  } finally {
48
- cache.loading.value = false;
38
+ isLoadingEnum.value = false;
49
39
  }
50
-
51
- return cache.data.value;
52
40
  };
53
41
 
54
- // 自动加载
42
+ // 初始化调用(可选,也可由外部调用)
55
43
  getStatusEnumList();
56
44
 
45
+ // 返回响应式数据和方法,供组件使用
57
46
  return {
58
- statusEnumList: cache.data,
59
- isLoadingEnum: cache.loading,
47
+ statusEnumList,
48
+ isLoadingEnum
60
49
  };
61
50
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yuang-framework-ui-common",
3
- "version": "1.0.112",
3
+ "version": "1.0.113",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "scripts": {