wui-components-v2 1.1.70 → 1.1.71

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.
Files changed (79) hide show
  1. package/api/feishu.ts +20 -20
  2. package/api/index.ts +4 -4
  3. package/api/login.ts +51 -51
  4. package/api/tree.ts +28 -28
  5. package/components/action-popup/action-popup.vue +116 -116
  6. package/components/add-address-list/add-address-list.vue +187 -187
  7. package/components/add-address-page/config.ts +297 -297
  8. package/components/audio-play/audio-play.vue +220 -220
  9. package/components/batch-upload-file/batch-upload-file.vue +75 -75
  10. package/components/card-botom-buttons/card-botom-buttons.vue +279 -279
  11. package/components/demo-card/demo-card.vue +44 -44
  12. package/components/fold-card/fold-card.vue +2 -2
  13. package/components/global-loading/GlobalLoading.md +366 -366
  14. package/components/global-loading/global-loading.vue +55 -55
  15. package/components/global-message/GlobalMessage.md +570 -570
  16. package/components/global-toast/GlobalToast.md +261 -261
  17. package/components/global-toast/global-toast.vue +56 -56
  18. package/components/label-value/open-value-more.vue +56 -56
  19. package/components/loading/loading.vue +5 -5
  20. package/components/login-form-box/login-form-box.vue +65 -65
  21. package/components/phone-login-form/phone-login-form.vue +204 -204
  22. package/components/privacy-popup/privacy-popup.vue +191 -191
  23. package/components/scan-input/scan-input.vue +406 -406
  24. package/components/select-col-picker/select-col-picker.vue +168 -168
  25. package/components/tab-search/tab-search.vue +73 -73
  26. package/components/tree-select/components/TreeNode.vue +200 -200
  27. package/components/tree-select/components/index.vue +471 -471
  28. package/components/tree-select/components/tree-select.vue +56 -56
  29. package/components/tree-select/index.vue +93 -93
  30. package/components/user-choose/user-choose.vue +169 -151
  31. package/components/video-play/video-play.vue +56 -56
  32. package/components/wui-auto-update-component/wui-auto-update-component.vue +132 -132
  33. package/components/wui-default/wui-default.vue +49 -49
  34. package/components/wui-details-page/wui-details-page.vue +147 -147
  35. package/components/wui-edit-page/wui-edit-page-copy.vue +757 -757
  36. package/components/wui-edit-page/wui-edit-page.vue +793 -793
  37. package/components/wui-login/wui-login.vue +43 -43
  38. package/components/wui-login1/wui-login.vue +41 -41
  39. package/components/wui-menus/wui-menus-top.vue +137 -137
  40. package/components/wui-menus/wui-menus-top1.vue +8 -8
  41. package/components/wui-menus1/components/banner-carousel.vue +320 -320
  42. package/components/wui-menus1/components/quick-panel.vue +55 -55
  43. package/components/wui-menus1/components/search-bar.vue +49 -49
  44. package/components/wui-menus1/components/section-menus.vue +208 -208
  45. package/components/wui-menus1/wui-menus-top.vue +718 -718
  46. package/components/wui-menus1/wui-menus-top1.vue +398 -398
  47. package/components/wui-notify-info/notify-handle.vue +53 -53
  48. package/components/wui-scan-binding-sensor/wui-scan-binding-sensor.vue +75 -75
  49. package/components/wui-search-history-babbar/components/SearchBar.vue +70 -70
  50. package/components/wui-select-popup/wui-select-popup.vue +1 -0
  51. package/components/wui-tree-page/wui-tree-page.vue +297 -297
  52. package/components/wui-update-component/wui-update-component.vue +221 -221
  53. package/composables/types/theme.ts +65 -65
  54. package/composables/types/user.ts +5 -5
  55. package/composables/useColorGenerator.ts +221 -221
  56. package/composables/useEnumes.ts +43 -43
  57. package/composables/useEventBus.ts +37 -37
  58. package/composables/useGlobalLoading.ts +47 -47
  59. package/composables/useGlobalMessage.ts +53 -53
  60. package/composables/useGlobalToast.ts +63 -63
  61. package/composables/useLocale.ts +54 -54
  62. package/composables/useManualTheme.ts +179 -179
  63. package/composables/useSectionMenus.ts +120 -120
  64. package/composables/useTabbar.ts +50 -50
  65. package/composables/useTheme.ts +74 -74
  66. package/composables/useUser.ts +24 -24
  67. package/index.d.ts +90 -90
  68. package/package.json +24 -24
  69. package/store/manualThemeStore.ts +143 -143
  70. package/store/persist.ts +41 -41
  71. package/store/themeStore.ts +74 -74
  72. package/store/userStore.ts +22 -22
  73. package/styles/dark-mode.scss +498 -498
  74. package/type.ts +154 -154
  75. package/utils/control-tree.ts +353 -353
  76. package/utils/eventBus.ts +36 -36
  77. package/utils/idata-scan.ts +99 -99
  78. package/utils/index.ts +979 -979
  79. package/utils/rsaEncrypt.ts +10 -10
@@ -1,221 +1,221 @@
1
- import { computed, ref } from 'vue'
2
- import {
3
- generateHarmoniousColors,
4
- generateIconColors,
5
- generateRandomColorFromHex,
6
- getColorVariant,
7
- hexToRgb,
8
- rgbToHex,
9
- } from '../utils/index'
10
- import { useManualTheme } from './useManualTheme'
11
- // 定义颜色对象的类型
12
- interface ColorObject {
13
- hex: string
14
- rgb: { r: number, g: number, b: number }
15
- hsl: { h: number, s: number, l: number }
16
- }
17
-
18
- /**
19
- * Vue 3 Composition API: 颜色生成器
20
- * @param {string} baseHex - 基础十六进制颜色,如 #2164F3
21
- * @param {object} options - 配置选项
22
- * @returns {object} 颜色相关的方法和响应式数据
23
- */
24
- export function useColorGenerator(options = {}) {
25
- // 默认配置
26
- const defaultOptions = {
27
- hueRange: 60,
28
- saturationRange: 0,
29
- lightnessRange: 0,
30
- count: 8,
31
- autoRegenerate: true,
32
- }
33
-
34
- const config = { ...defaultOptions, ...options }
35
- const {
36
- currentThemeColor,
37
- } = useManualTheme()
38
- // 响应式数据
39
- const baseColor = computed(() => currentThemeColor.value.primary)
40
- const hueRange = ref(config.hueRange)
41
- const saturationRange = ref(config.saturationRange)
42
- const lightnessRange = ref(config.lightnessRange)
43
- const colors = ref<ColorObject[]>([])
44
- const currentRandomColor = ref<ColorObject | null>(null)
45
- const colorVariants = ref<Record<string, string>>({})
46
-
47
- /**
48
- * 生成基础颜色的RGB对象
49
- */
50
- const baseRgb = computed(() => hexToRgb(baseColor.value))
51
-
52
- /**
53
- * 生成单个随机颜色
54
- */
55
- const generateRandomColor = () => {
56
- currentRandomColor.value = generateRandomColorFromHex(baseColor.value, {
57
- hueRange: hueRange.value,
58
- saturationRange: saturationRange.value,
59
- lightnessRange: lightnessRange.value,
60
- })
61
-
62
- return currentRandomColor.value
63
- }
64
-
65
- /**
66
- * 生成一组协调的颜色
67
- */
68
- const generateColors = (count = config.count) => {
69
- colors.value = generateHarmoniousColors(baseColor.value, count, {
70
- hueRange: hueRange.value,
71
- saturationRange: saturationRange.value,
72
- lightnessRange: lightnessRange.value,
73
- colorType: '',
74
- })
75
-
76
- return colors.value
77
- }
78
-
79
- /**
80
- * 生成图标颜色(使用智能算法)
81
- */
82
- const generateSmartIconColors = (count = config.count) => {
83
- colors.value = generateIconColors(baseColor.value, count)
84
- return colors.value
85
- }
86
-
87
- /**
88
- * 生成颜色变体
89
- */
90
- const generateColorVariants = () => {
91
- const variants = ['lighter', 'light', 'dark', 'darker', 'muted']
92
- colorVariants.value = {}
93
-
94
- variants.forEach((variant) => {
95
- colorVariants.value[variant] = getColorVariant(baseColor.value, variant)
96
- })
97
-
98
- return colorVariants.value
99
- }
100
-
101
- /**
102
- * 更新基础颜色
103
- */
104
- // const updateBaseColor = (newHex: string) => {
105
- // baseColor.value = newHex;
106
- // if (config.autoRegenerate) {
107
- // generateRandomColor();
108
- // generateColors();
109
- // }
110
- // };
111
-
112
- /**
113
- * 更新配置
114
- */
115
- const updateConfig = (newConfig: { hueRange: number | undefined, saturationRange: number | undefined, lightnessRange: number | undefined }) => {
116
- if (newConfig.hueRange !== undefined) {
117
- hueRange.value = newConfig.hueRange
118
- }
119
- if (newConfig.saturationRange !== undefined) {
120
- saturationRange.value = newConfig.saturationRange
121
- }
122
- if (newConfig.lightnessRange !== undefined) {
123
- lightnessRange.value = newConfig.lightnessRange
124
- }
125
-
126
- if (config.autoRegenerate) {
127
- generateRandomColor()
128
- generateColors()
129
- }
130
- }
131
-
132
- /**
133
- * 获取CSS变量对象,方便在CSS中使用
134
- */
135
- const cssVariables = computed(() => {
136
- const vars: Record<string, string> = {
137
- '--primary': baseColor.value,
138
- '--primary-rgb': `${baseRgb.value.r}, ${baseRgb.value.g}, ${baseRgb.value.b}`,
139
- }
140
-
141
- // 添加颜色变体
142
- Object.entries(colorVariants.value).forEach(([key, value]) => {
143
- vars[`--primary-${key}`] = value as string
144
- })
145
-
146
- // 添加生成的颜色
147
- colors.value.forEach((color, index) => {
148
- vars[`--color-${index + 1}`] = color.hex
149
- vars[`--color-${index + 1}-rgb`] = `${color.rgb.r}, ${color.rgb.g}, ${color.rgb.b}`
150
- })
151
-
152
- return vars
153
- })
154
-
155
- /**
156
- * 应用到DOM元素的样式
157
- */
158
- const applyStyleToElement = (element: { style: { color: any, setProperty: (arg0: string, arg1: any) => void } }, colorObj: { hex: any }) => {
159
- if (element && colorObj) {
160
- element.style.color = colorObj.hex
161
- element.style.setProperty('--current-color', colorObj.hex)
162
- }
163
- }
164
-
165
- // 初始化
166
- generateRandomColor()
167
- generateColors()
168
- generateColorVariants()
169
-
170
- return {
171
- // 响应式数据
172
- baseColor,
173
- baseRgb,
174
- hueRange,
175
- saturationRange,
176
- lightnessRange,
177
- colors,
178
- currentRandomColor,
179
- colorVariants,
180
- cssVariables,
181
-
182
- // 计算属性
183
- currentHex: computed(() =>
184
- currentRandomColor.value?.hex || baseColor.value,
185
- ),
186
-
187
- // 方法
188
- generateRandomColor,
189
- generateColors,
190
- generateSmartIconColors,
191
- generateColorVariants,
192
- // updateBaseColor,
193
- updateConfig,
194
- applyStyleToElement,
195
-
196
- // 工具方法
197
- hexToRgb,
198
- rgbToHex,
199
- }
200
- }
201
-
202
- /**
203
- * 快速使用的简易版本
204
- * @param {string} baseHex - 基础颜色
205
- * @returns {object} 简化的颜色生成器
206
- */
207
- export function useQuickColorGenerator() {
208
- const generator = useColorGenerator({
209
- count: 5,
210
- autoRegenerate: false,
211
- })
212
-
213
- // 立即生成一次
214
- generator.generateSmartIconColors()
215
-
216
- return {
217
- colors: generator.colors,
218
- getRandomColor: generator.generateRandomColor,
219
- refreshColors: () => generator.generateSmartIconColors(5),
220
- }
221
- }
1
+ import { computed, ref } from 'vue'
2
+ import {
3
+ generateHarmoniousColors,
4
+ generateIconColors,
5
+ generateRandomColorFromHex,
6
+ getColorVariant,
7
+ hexToRgb,
8
+ rgbToHex,
9
+ } from '../utils/index'
10
+ import { useManualTheme } from './useManualTheme'
11
+ // 定义颜色对象的类型
12
+ interface ColorObject {
13
+ hex: string
14
+ rgb: { r: number, g: number, b: number }
15
+ hsl: { h: number, s: number, l: number }
16
+ }
17
+
18
+ /**
19
+ * Vue 3 Composition API: 颜色生成器
20
+ * @param {string} baseHex - 基础十六进制颜色,如 #2164F3
21
+ * @param {object} options - 配置选项
22
+ * @returns {object} 颜色相关的方法和响应式数据
23
+ */
24
+ export function useColorGenerator(options = {}) {
25
+ // 默认配置
26
+ const defaultOptions = {
27
+ hueRange: 60,
28
+ saturationRange: 0,
29
+ lightnessRange: 0,
30
+ count: 8,
31
+ autoRegenerate: true,
32
+ }
33
+
34
+ const config = { ...defaultOptions, ...options }
35
+ const {
36
+ currentThemeColor,
37
+ } = useManualTheme()
38
+ // 响应式数据
39
+ const baseColor = computed(() => currentThemeColor.value.primary)
40
+ const hueRange = ref(config.hueRange)
41
+ const saturationRange = ref(config.saturationRange)
42
+ const lightnessRange = ref(config.lightnessRange)
43
+ const colors = ref<ColorObject[]>([])
44
+ const currentRandomColor = ref<ColorObject | null>(null)
45
+ const colorVariants = ref<Record<string, string>>({})
46
+
47
+ /**
48
+ * 生成基础颜色的RGB对象
49
+ */
50
+ const baseRgb = computed(() => hexToRgb(baseColor.value))
51
+
52
+ /**
53
+ * 生成单个随机颜色
54
+ */
55
+ const generateRandomColor = () => {
56
+ currentRandomColor.value = generateRandomColorFromHex(baseColor.value, {
57
+ hueRange: hueRange.value,
58
+ saturationRange: saturationRange.value,
59
+ lightnessRange: lightnessRange.value,
60
+ })
61
+
62
+ return currentRandomColor.value
63
+ }
64
+
65
+ /**
66
+ * 生成一组协调的颜色
67
+ */
68
+ const generateColors = (count = config.count) => {
69
+ colors.value = generateHarmoniousColors(baseColor.value, count, {
70
+ hueRange: hueRange.value,
71
+ saturationRange: saturationRange.value,
72
+ lightnessRange: lightnessRange.value,
73
+ colorType: '',
74
+ })
75
+
76
+ return colors.value
77
+ }
78
+
79
+ /**
80
+ * 生成图标颜色(使用智能算法)
81
+ */
82
+ const generateSmartIconColors = (count = config.count) => {
83
+ colors.value = generateIconColors(baseColor.value, count)
84
+ return colors.value
85
+ }
86
+
87
+ /**
88
+ * 生成颜色变体
89
+ */
90
+ const generateColorVariants = () => {
91
+ const variants = ['lighter', 'light', 'dark', 'darker', 'muted']
92
+ colorVariants.value = {}
93
+
94
+ variants.forEach((variant) => {
95
+ colorVariants.value[variant] = getColorVariant(baseColor.value, variant)
96
+ })
97
+
98
+ return colorVariants.value
99
+ }
100
+
101
+ /**
102
+ * 更新基础颜色
103
+ */
104
+ // const updateBaseColor = (newHex: string) => {
105
+ // baseColor.value = newHex;
106
+ // if (config.autoRegenerate) {
107
+ // generateRandomColor();
108
+ // generateColors();
109
+ // }
110
+ // };
111
+
112
+ /**
113
+ * 更新配置
114
+ */
115
+ const updateConfig = (newConfig: { hueRange: number | undefined, saturationRange: number | undefined, lightnessRange: number | undefined }) => {
116
+ if (newConfig.hueRange !== undefined) {
117
+ hueRange.value = newConfig.hueRange
118
+ }
119
+ if (newConfig.saturationRange !== undefined) {
120
+ saturationRange.value = newConfig.saturationRange
121
+ }
122
+ if (newConfig.lightnessRange !== undefined) {
123
+ lightnessRange.value = newConfig.lightnessRange
124
+ }
125
+
126
+ if (config.autoRegenerate) {
127
+ generateRandomColor()
128
+ generateColors()
129
+ }
130
+ }
131
+
132
+ /**
133
+ * 获取CSS变量对象,方便在CSS中使用
134
+ */
135
+ const cssVariables = computed(() => {
136
+ const vars: Record<string, string> = {
137
+ '--primary': baseColor.value,
138
+ '--primary-rgb': `${baseRgb.value.r}, ${baseRgb.value.g}, ${baseRgb.value.b}`,
139
+ }
140
+
141
+ // 添加颜色变体
142
+ Object.entries(colorVariants.value).forEach(([key, value]) => {
143
+ vars[`--primary-${key}`] = value as string
144
+ })
145
+
146
+ // 添加生成的颜色
147
+ colors.value.forEach((color, index) => {
148
+ vars[`--color-${index + 1}`] = color.hex
149
+ vars[`--color-${index + 1}-rgb`] = `${color.rgb.r}, ${color.rgb.g}, ${color.rgb.b}`
150
+ })
151
+
152
+ return vars
153
+ })
154
+
155
+ /**
156
+ * 应用到DOM元素的样式
157
+ */
158
+ const applyStyleToElement = (element: { style: { color: any, setProperty: (arg0: string, arg1: any) => void } }, colorObj: { hex: any }) => {
159
+ if (element && colorObj) {
160
+ element.style.color = colorObj.hex
161
+ element.style.setProperty('--current-color', colorObj.hex)
162
+ }
163
+ }
164
+
165
+ // 初始化
166
+ generateRandomColor()
167
+ generateColors()
168
+ generateColorVariants()
169
+
170
+ return {
171
+ // 响应式数据
172
+ baseColor,
173
+ baseRgb,
174
+ hueRange,
175
+ saturationRange,
176
+ lightnessRange,
177
+ colors,
178
+ currentRandomColor,
179
+ colorVariants,
180
+ cssVariables,
181
+
182
+ // 计算属性
183
+ currentHex: computed(() =>
184
+ currentRandomColor.value?.hex || baseColor.value,
185
+ ),
186
+
187
+ // 方法
188
+ generateRandomColor,
189
+ generateColors,
190
+ generateSmartIconColors,
191
+ generateColorVariants,
192
+ // updateBaseColor,
193
+ updateConfig,
194
+ applyStyleToElement,
195
+
196
+ // 工具方法
197
+ hexToRgb,
198
+ rgbToHex,
199
+ }
200
+ }
201
+
202
+ /**
203
+ * 快速使用的简易版本
204
+ * @param {string} baseHex - 基础颜色
205
+ * @returns {object} 简化的颜色生成器
206
+ */
207
+ export function useQuickColorGenerator() {
208
+ const generator = useColorGenerator({
209
+ count: 5,
210
+ autoRegenerate: false,
211
+ })
212
+
213
+ // 立即生成一次
214
+ generator.generateSmartIconColors()
215
+
216
+ return {
217
+ colors: generator.colors,
218
+ getRandomColor: generator.generateRandomColor,
219
+ refreshColors: () => generator.generateSmartIconColors(5),
220
+ }
221
+ }
@@ -1,43 +1,43 @@
1
- import { ref } from 'vue'
2
- import { enums } from '../api/page'
3
- import ControlTypeSupportor from '../utils/control-type-supportor'
4
- import type { Enums } from '../type'
5
-
6
- export function useEnums({ config }: { config: any }) {
7
- const enumColumn = ref<Enums>({})
8
- // 获取枚举
9
- async function getEnums() {
10
- try {
11
- const params: string[] = []
12
- const criteria = config.value?.criteria ?? []
13
- const columns = config.value.columns ?? []
14
- const writes = config.value.rowActions?.reduce((acc: any, cur: any) => {
15
- return [...acc, ...cur.writes]
16
- }, []) || []
17
- columns.forEach((item: any) => {
18
- if (ControlTypeSupportor.getControlType(item) === 'select' || ControlTypeSupportor.getControlType(item) === 'multiselect') {
19
- params.push(`mstrucIds=${item.mstrucId}`)
20
- }
21
- })
22
- criteria.forEach((item: any) => {
23
- if (ControlTypeSupportor.getControlType(item) === 'select' || ControlTypeSupportor.getControlType(item) === 'multiselect') {
24
- params.push(`mstrucIds=${item.mstrucId}`)
25
- }
26
- })
27
- writes.forEach((item: any) => {
28
- if (ControlTypeSupportor.getControlType(item) === 'select' || ControlTypeSupportor.getControlType(item) === 'multiselect') {
29
- params.push(`mstrucIds=${item.mstrucId}`)
30
- }
31
- })
32
- if (!params.length)
33
- return
34
- const res = await enums(params.join('&'))
35
- enumColumn.value = res.enumMap || {}
36
- }
37
- catch (error) {
38
- console.log('error:', error)
39
- }
40
- }
41
-
42
- return { getEnums, enumColumn }
43
- }
1
+ import { ref } from 'vue'
2
+ import { enums } from '../api/page'
3
+ import ControlTypeSupportor from '../utils/control-type-supportor'
4
+ import type { Enums } from '../type'
5
+
6
+ export function useEnums({ config }: { config: any }) {
7
+ const enumColumn = ref<Enums>({})
8
+ // 获取枚举
9
+ async function getEnums() {
10
+ try {
11
+ const params: string[] = []
12
+ const criteria = config.value?.criteria ?? []
13
+ const columns = config.value.columns ?? []
14
+ const writes = config.value.rowActions?.reduce((acc: any, cur: any) => {
15
+ return [...acc, ...cur.writes]
16
+ }, []) || []
17
+ columns.forEach((item: any) => {
18
+ if (ControlTypeSupportor.getControlType(item) === 'select' || ControlTypeSupportor.getControlType(item) === 'multiselect') {
19
+ params.push(`mstrucIds=${item.mstrucId}`)
20
+ }
21
+ })
22
+ criteria.forEach((item: any) => {
23
+ if (ControlTypeSupportor.getControlType(item) === 'select' || ControlTypeSupportor.getControlType(item) === 'multiselect') {
24
+ params.push(`mstrucIds=${item.mstrucId}`)
25
+ }
26
+ })
27
+ writes.forEach((item: any) => {
28
+ if (ControlTypeSupportor.getControlType(item) === 'select' || ControlTypeSupportor.getControlType(item) === 'multiselect') {
29
+ params.push(`mstrucIds=${item.mstrucId}`)
30
+ }
31
+ })
32
+ if (!params.length)
33
+ return
34
+ const res = await enums(params.join('&'))
35
+ enumColumn.value = res.enumMap || {}
36
+ }
37
+ catch (error) {
38
+ console.log('error:', error)
39
+ }
40
+ }
41
+
42
+ return { getEnums, enumColumn }
43
+ }
@@ -1,37 +1,37 @@
1
- import { onUnmounted } from 'vue'
2
- import { eventBus } from '../utils/eventBus'
3
-
4
- export function useEventBus() {
5
- const subscriptions: Array<{ event: string, callback: (...args: any[]) => void }> = []
6
-
7
- const on = (event: string, callback: (...args: any[]) => void) => {
8
- eventBus.on(event, callback)
9
- subscriptions.push({ event, callback })
10
- }
11
-
12
- const off = (event: string, callback: (...args: any[]) => void) => {
13
- eventBus.off(event, callback)
14
- }
15
-
16
- const emit = (event: string, ...args: any[]) => {
17
- eventBus.emit(event, ...args)
18
- }
19
-
20
- const once = (event: string, callback: (...args: any[]) => void) => {
21
- eventBus.once(event, callback)
22
- }
23
-
24
- onUnmounted(() => {
25
- // 组件卸载时自动取消订阅
26
- subscriptions.forEach(({ event, callback }) => {
27
- eventBus.off(event, callback)
28
- })
29
- })
30
-
31
- return {
32
- on,
33
- off,
34
- emit,
35
- once,
36
- }
37
- }
1
+ import { onUnmounted } from 'vue'
2
+ import { eventBus } from '../utils/eventBus'
3
+
4
+ export function useEventBus() {
5
+ const subscriptions: Array<{ event: string, callback: (...args: any[]) => void }> = []
6
+
7
+ const on = (event: string, callback: (...args: any[]) => void) => {
8
+ eventBus.on(event, callback)
9
+ subscriptions.push({ event, callback })
10
+ }
11
+
12
+ const off = (event: string, callback: (...args: any[]) => void) => {
13
+ eventBus.off(event, callback)
14
+ }
15
+
16
+ const emit = (event: string, ...args: any[]) => {
17
+ eventBus.emit(event, ...args)
18
+ }
19
+
20
+ const once = (event: string, callback: (...args: any[]) => void) => {
21
+ eventBus.once(event, callback)
22
+ }
23
+
24
+ onUnmounted(() => {
25
+ // 组件卸载时自动取消订阅
26
+ subscriptions.forEach(({ event, callback }) => {
27
+ eventBus.off(event, callback)
28
+ })
29
+ })
30
+
31
+ return {
32
+ on,
33
+ off,
34
+ emit,
35
+ once,
36
+ }
37
+ }