uview-pro 0.3.0 → 0.3.1
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.
- package/changelog.md +584 -574
- package/components/common/props.ts +22 -22
- package/components/u-action-sheet/types.ts +37 -37
- package/components/u-action-sheet/u-action-sheet.vue +178 -178
- package/components/u-alert-tips/types.ts +41 -41
- package/components/u-alert-tips/u-alert-tips.vue +238 -238
- package/components/u-avatar/types.ts +36 -36
- package/components/u-avatar/u-avatar.vue +217 -217
- package/components/u-avatar-cropper/types.ts +23 -23
- package/components/u-avatar-cropper/u-avatar-cropper.vue +297 -297
- package/components/u-avatar-cropper/weCropper.d.ts +62 -62
- package/components/u-avatar-cropper/weCropper.js +1281 -1281
- package/components/u-avatar-cropper/weCropper.ts +1276 -1276
- package/components/u-back-top/types.ts +36 -36
- package/components/u-back-top/u-back-top.vue +140 -140
- package/components/u-badge/types.ts +38 -38
- package/components/u-badge/u-badge.vue +183 -183
- package/components/u-button/types.ts +66 -66
- package/components/u-button/u-button.vue +579 -579
- package/components/u-calendar/types.ts +75 -75
- package/components/u-calendar/u-calendar.vue +793 -793
- package/components/u-car-keyboard/types.ts +14 -14
- package/components/u-car-keyboard/u-car-keyboard.vue +262 -262
- package/components/u-card/types.ts +61 -61
- package/components/u-card/u-card.vue +209 -209
- package/components/u-cell-group/types.ts +19 -19
- package/components/u-cell-group/u-cell-group.vue +60 -60
- package/components/u-cell-item/types.ts +56 -56
- package/components/u-cell-item/u-cell-item.vue +226 -226
- package/components/u-checkbox/types.ts +33 -33
- package/components/u-checkbox/u-checkbox.vue +282 -282
- package/components/u-checkbox-group/types.ts +34 -34
- package/components/u-checkbox-group/u-checkbox-group.vue +130 -130
- package/components/u-circle-progress/types.ts +54 -54
- package/components/u-circle-progress/u-circle-progress.vue +206 -206
- package/components/u-city-select/types.ts +22 -22
- package/components/u-city-select/u-city-select.vue +276 -276
- package/components/u-col/types.ts +32 -32
- package/components/u-col/u-col.vue +142 -142
- package/components/u-collapse/types.ts +33 -33
- package/components/u-collapse/u-collapse.vue +190 -190
- package/components/u-collapse-item/types.ts +27 -27
- package/components/u-collapse-item/u-collapse-item.vue +290 -290
- package/components/u-column-notice/types.ts +50 -50
- package/components/u-column-notice/u-column-notice.vue +222 -222
- package/components/u-count-down/types.ts +44 -44
- package/components/u-count-down/u-count-down.vue +286 -286
- package/components/u-count-to/types.ts +34 -34
- package/components/u-count-to/u-count-to.vue +266 -266
- package/components/u-divider/types.ts +33 -33
- package/components/u-divider/u-divider.vue +145 -145
- package/components/u-dropdown/types.ts +34 -34
- package/components/u-dropdown/u-dropdown.vue +330 -330
- package/components/u-dropdown-item/types.ts +29 -29
- package/components/u-dropdown-item/u-dropdown-item.vue +120 -120
- package/components/u-empty/types.ts +38 -38
- package/components/u-empty/u-empty.vue +103 -103
- package/components/u-field/types.ts +71 -71
- package/components/u-field/u-field.vue +388 -388
- package/components/u-form/types.ts +29 -29
- package/components/u-form/u-form.vue +130 -130
- package/components/u-form-item/types.ts +72 -72
- package/components/u-form-item/u-form-item.vue +447 -447
- package/components/u-full-screen/types.ts +16 -16
- package/components/u-full-screen/u-full-screen.vue +103 -103
- package/components/u-gap/types.ts +20 -20
- package/components/u-gap/u-gap.vue +50 -50
- package/components/u-grid/types.ts +21 -21
- package/components/u-grid/u-grid.vue +91 -91
- package/components/u-grid-item/types.ts +16 -16
- package/components/u-grid-item/u-grid-item.vue +130 -130
- package/components/u-icon/types.ts +61 -61
- package/components/u-icon/u-icon.vue +296 -296
- package/components/u-image/types.ts +51 -51
- package/components/u-image/u-image.vue +239 -239
- package/components/u-index-anchor/types.ts +16 -16
- package/components/u-index-anchor/u-index-anchor.vue +94 -94
- package/components/u-index-list/types.ts +43 -43
- package/components/u-index-list/u-index-list.vue +352 -352
- package/components/u-input/types.ts +137 -137
- package/components/u-input/u-input.vue +288 -288
- package/components/u-keyboard/types.ts +40 -40
- package/components/u-keyboard/u-keyboard.vue +178 -178
- package/components/u-lazy-load/types.ts +37 -37
- package/components/u-lazy-load/u-lazy-load.vue +246 -246
- package/components/u-line/types.ts +44 -44
- package/components/u-line/u-line.vue +68 -68
- package/components/u-line-progress/types.ts +58 -58
- package/components/u-line-progress/u-line-progress.vue +126 -126
- package/components/u-link/types.ts +43 -43
- package/components/u-link/u-link.vue +84 -84
- package/components/u-loading/types.ts +35 -35
- package/components/u-loading/u-loading.vue +105 -105
- package/components/u-loading-popup/types.ts +26 -26
- package/components/u-loading-popup/u-loading-popup.vue +253 -253
- package/components/u-loadmore/types.ts +79 -79
- package/components/u-loadmore/u-loadmore.vue +156 -156
- package/components/u-mask/types.ts +40 -40
- package/components/u-mask/u-mask.vue +113 -113
- package/components/u-message-input/types.ts +74 -74
- package/components/u-message-input/u-message-input.vue +281 -281
- package/components/u-modal/types.ts +118 -118
- package/components/u-modal/u-modal.vue +220 -220
- package/components/u-navbar/types.ts +103 -103
- package/components/u-navbar/u-navbar.vue +251 -251
- package/components/u-no-network/image.ts +2 -2
- package/components/u-no-network/types.ts +28 -28
- package/components/u-no-network/u-no-network.vue +303 -303
- package/components/u-notice-bar/types.ts +111 -111
- package/components/u-notice-bar/u-notice-bar.vue +189 -189
- package/components/u-number-box/types.ts +42 -42
- package/components/u-number-box/u-number-box.vue +321 -321
- package/components/u-number-keyboard/types.ts +26 -26
- package/components/u-number-keyboard/u-number-keyboard.vue +188 -188
- package/components/u-picker/types.ts +123 -123
- package/components/u-picker/u-picker.vue +685 -685
- package/components/u-popup/types.ts +59 -59
- package/components/u-popup/u-popup.vue +385 -385
- package/components/u-radio/types.ts +27 -27
- package/components/u-radio/u-radio.vue +279 -279
- package/components/u-radio-group/types.ts +31 -31
- package/components/u-radio-group/u-radio-group.vue +96 -96
- package/components/u-rate/types.ts +42 -42
- package/components/u-rate/u-rate.vue +249 -249
- package/components/u-read-more/types.ts +37 -37
- package/components/u-read-more/u-read-more.vue +172 -172
- package/components/u-root-portal/u-root-portal.vue +56 -56
- package/components/u-row/types.ts +22 -22
- package/components/u-row/u-row.vue +105 -105
- package/components/u-row-notice/types.ts +41 -41
- package/components/u-row-notice/u-row-notice.vue +256 -256
- package/components/u-safe-bottom/u-safe-bottom.vue +57 -57
- package/components/u-search/types.ts +55 -55
- package/components/u-search/u-search.vue +279 -279
- package/components/u-section/types.ts +34 -34
- package/components/u-section/u-section.vue +150 -150
- package/components/u-select/types.ts +45 -45
- package/components/u-select/u-select.vue +388 -388
- package/components/u-skeleton/types.ts +22 -22
- package/components/u-skeleton/u-skeleton.vue +231 -231
- package/components/u-slider/types.ts +34 -34
- package/components/u-slider/u-slider.vue +255 -255
- package/components/u-status-bar/u-status-bar.vue +74 -74
- package/components/u-steps/types.ts +30 -30
- package/components/u-steps/u-steps.vue +181 -181
- package/components/u-sticky/types.ts +24 -24
- package/components/u-sticky/u-sticky.vue +178 -178
- package/components/u-subsection/types.ts +38 -38
- package/components/u-subsection/u-subsection.vue +339 -339
- package/components/u-swipe-action/types.ts +52 -52
- package/components/u-swipe-action/u-swipe-action.vue +276 -276
- package/components/u-swiper/types.ts +49 -49
- package/components/u-swiper/u-swiper.vue +308 -308
- package/components/u-switch/types.ts +30 -30
- package/components/u-switch/u-switch.vue +150 -150
- package/components/u-tabbar/types.ts +38 -38
- package/components/u-tabbar/u-tabbar.vue +315 -315
- package/components/u-table/types.ts +27 -27
- package/components/u-table/u-table.vue +67 -67
- package/components/u-tabs/types.ts +53 -53
- package/components/u-tabs/u-tabs.vue +302 -302
- package/components/u-tabs-swiper/types.ts +55 -55
- package/components/u-tabs-swiper/u-tabs-swiper.vue +409 -409
- package/components/u-tag/types.ts +39 -39
- package/components/u-tag/u-tag.vue +268 -268
- package/components/u-td/types.ts +14 -14
- package/components/u-td/u-td.vue +98 -98
- package/components/u-text/types.ts +72 -72
- package/components/u-text/u-text.vue +343 -343
- package/components/u-th/types.ts +14 -14
- package/components/u-th/u-th.vue +92 -92
- package/components/u-time-line/u-time-line.vue +53 -53
- package/components/u-time-line-item/types.ts +16 -16
- package/components/u-time-line-item/u-time-line-item.vue +90 -90
- package/components/u-toast/types.ts +38 -38
- package/components/u-toast/u-toast.vue +240 -240
- package/components/u-top-tips/types.ts +16 -16
- package/components/u-top-tips/u-top-tips.vue +130 -130
- package/components/u-tr/types.ts +11 -11
- package/components/u-tr/u-tr.vue +39 -39
- package/components/u-upload/types.ts +82 -82
- package/components/u-upload/u-upload.vue +568 -568
- package/components/u-verification-code/types.ts +24 -24
- package/components/u-verification-code/u-verification-code.vue +176 -176
- package/components/u-waterfall/types.ts +18 -18
- package/components/u-waterfall/u-waterfall.vue +187 -187
- package/iconfont.css +913 -913
- package/index.scss +25 -25
- package/index.ts +38 -38
- package/libs/config/config.ts +26 -26
- package/libs/config/zIndex.ts +37 -37
- package/libs/css/color.scss +155 -155
- package/libs/css/common.scss +178 -178
- package/libs/css/style.components.scss +16 -16
- package/libs/css/style.h5.scss +8 -8
- package/libs/css/style.mp.scss +72 -72
- package/libs/css/style.nvue.scss +15 -15
- package/libs/css/style.vue.scss +188 -188
- package/libs/function/$parent.ts +24 -24
- package/libs/function/addUnit.ts +13 -13
- package/libs/function/color.ts +37 -37
- package/libs/function/colorGradient.ts +139 -139
- package/libs/function/debounce.ts +28 -28
- package/libs/function/deepClone.ts +39 -39
- package/libs/function/deepMerge.ts +35 -35
- package/libs/function/getParent.ts +63 -63
- package/libs/function/getRect.ts +26 -26
- package/libs/function/guid.ts +42 -42
- package/libs/function/md5.ts +403 -403
- package/libs/function/parent.ts +21 -21
- package/libs/function/queryParams.ts +64 -64
- package/libs/function/random.ts +16 -16
- package/libs/function/randomArray.ts +11 -11
- package/libs/function/route.ts +118 -118
- package/libs/function/styleUtils.ts +83 -83
- package/libs/function/sys.ts +15 -15
- package/libs/function/test.ts +289 -289
- package/libs/function/throttle.ts +31 -31
- package/libs/function/timeFormat.ts +55 -55
- package/libs/function/timeFrom.ts +48 -48
- package/libs/function/toast.ts +14 -14
- package/libs/function/trim.ts +21 -21
- package/libs/function/type2icon.ts +39 -39
- package/libs/hooks/index.ts +4 -4
- package/libs/hooks/useCompRelation.ts +364 -364
- package/libs/hooks/useComponent.ts +759 -759
- package/libs/hooks/useEmitter.ts +79 -79
- package/libs/hooks/useParent.ts +33 -33
- package/libs/hooks/useRect.ts +33 -33
- package/libs/index.ts +337 -337
- package/libs/request/auto-http.ts +76 -76
- package/libs/request/index.ts +242 -242
- package/libs/store/index.ts +88 -88
- package/libs/util/async-validator.d.ts +75 -75
- package/libs/util/async-validator.js +1 -1
- package/libs/util/calendar.d.ts +57 -57
- package/libs/util/emitter.ts +112 -112
- package/libs/util/eventBus.ts +86 -86
- package/libs/util/logger.ts +364 -364
- package/libs/util/mitt.ts +118 -118
- package/libs/util/parent.ts +20 -20
- package/package.json +4 -4
- package/readme.md +241 -241
- package/theme.scss +38 -38
- package/types/components.d.ts +97 -97
- package/types/global.d.ts +331 -331
- package/types/ignore-errors.d.ts +30 -30
- package/types/index.d.ts +19 -19
- package/types/uni-app.d.ts +63 -63
package/libs/util/emitter.ts
CHANGED
|
@@ -1,112 +1,112 @@
|
|
|
1
|
-
import { getCurrentInstance, type ComponentInternalInstance } from 'vue';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* 适用于 uni-app Vue3 的事件派发/广播工具
|
|
5
|
-
* 用法:import { dispatch, broadcast } from './emitter'
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* 向上查找父组件并派发事件
|
|
10
|
-
* @param instance 当前组件实例(setup中可用getCurrentInstance())
|
|
11
|
-
* @param componentName 目标组件名
|
|
12
|
-
* @param eventName 事件名
|
|
13
|
-
* @param params 参数
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
// 将事件名转换为驼峰格式
|
|
17
|
-
// 例如:on-form-change -> onFormChange
|
|
18
|
-
function formatToCamelCase(str: string): string {
|
|
19
|
-
return str.replace(/-([a-z])/g, function (g) {
|
|
20
|
-
return g[1].toUpperCase();
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* 向上查找父组件
|
|
26
|
-
* @param instance 当前组件实例(setup中可用getCurrentInstance())
|
|
27
|
-
* @param componentName 目标组件名
|
|
28
|
-
* @returns 父组件实例
|
|
29
|
-
*/
|
|
30
|
-
function parent(instance: ComponentInternalInstance | null | undefined = undefined, componentName: string = '') {
|
|
31
|
-
if (!instance) {
|
|
32
|
-
instance = getCurrentInstance();
|
|
33
|
-
}
|
|
34
|
-
let parent = instance && (instance.parent as ComponentInternalInstance | null | undefined);
|
|
35
|
-
|
|
36
|
-
if (!componentName) return parent;
|
|
37
|
-
while (parent) {
|
|
38
|
-
const name = (parent.type as any)?.name as string | undefined;
|
|
39
|
-
if (name === componentName) {
|
|
40
|
-
return parent;
|
|
41
|
-
}
|
|
42
|
-
parent = parent.parent;
|
|
43
|
-
}
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/** * 向上查找父组件并派发事件
|
|
48
|
-
* @param instance 当前组件实例(setup中可用getCurrentInstance())
|
|
49
|
-
* @param componentName 目标组件名
|
|
50
|
-
* @param eventName 事件名
|
|
51
|
-
* @param params 参数
|
|
52
|
-
*/
|
|
53
|
-
function dispatch(
|
|
54
|
-
instance: ComponentInternalInstance | null | undefined,
|
|
55
|
-
componentName: string,
|
|
56
|
-
eventName: string,
|
|
57
|
-
...params: any[]
|
|
58
|
-
) {
|
|
59
|
-
let parent = instance && (instance.parent as ComponentInternalInstance | null | undefined);
|
|
60
|
-
while (parent) {
|
|
61
|
-
const name = (parent.type as any)?.name as string | undefined;
|
|
62
|
-
if (name === componentName) {
|
|
63
|
-
// 找到目标组件,派发事件
|
|
64
|
-
// Vue3未解决,目标组件事件监听失效,待优化,暂时使用下面的方式解决,如果你有好的方式也可以告诉我或者提PR
|
|
65
|
-
parent.emit && parent.emit(eventName, ...params);
|
|
66
|
-
// 如果有对应的方法,执行方法
|
|
67
|
-
// 这里可以考虑将 eventName 转换为驼峰格式
|
|
68
|
-
// 例如:on-form-change -> onFormChange
|
|
69
|
-
parent.exposed?.[formatToCamelCase(eventName)] && parent.exposed[formatToCamelCase(eventName)](...params);
|
|
70
|
-
break;
|
|
71
|
-
}
|
|
72
|
-
parent = parent.parent;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* 向下递归查找子组件并广播事件
|
|
78
|
-
* @param instance 当前组件实例(setup中可用getCurrentInstance())
|
|
79
|
-
* @param componentName 目标组件名
|
|
80
|
-
* @param eventName 事件名
|
|
81
|
-
* @param params 参数
|
|
82
|
-
*/
|
|
83
|
-
function broadcast(
|
|
84
|
-
instance: ComponentInternalInstance | null | undefined,
|
|
85
|
-
componentName: string,
|
|
86
|
-
eventName: string,
|
|
87
|
-
...params: any[]
|
|
88
|
-
) {
|
|
89
|
-
if (!instance) return;
|
|
90
|
-
const subTree = (instance.subTree as any)?.children || [];
|
|
91
|
-
const children = Array.isArray(subTree) ? subTree : [subTree];
|
|
92
|
-
children.forEach((vnode: any) => {
|
|
93
|
-
const child = vnode.component as ComponentInternalInstance | undefined;
|
|
94
|
-
|
|
95
|
-
if (child) {
|
|
96
|
-
const name = (child.type as any)?.name as string | undefined;
|
|
97
|
-
if (name === componentName) {
|
|
98
|
-
// 找到目标组件,广播事件
|
|
99
|
-
// Vue3未解决,目标组件事件监听失效,待优化,暂时使用下面的方式解决,如果你有好的方式也可以告诉我或者提PR
|
|
100
|
-
child.emit && child.emit(eventName, ...params);
|
|
101
|
-
// 如果有对应的方法,执行方法
|
|
102
|
-
// 这里可以考虑将 eventName 转换为驼峰格式
|
|
103
|
-
// 例如:on-form-change -> onFormChange
|
|
104
|
-
child.exposed?.[formatToCamelCase(eventName)] && child.exposed[formatToCamelCase(eventName)](...params);
|
|
105
|
-
} else {
|
|
106
|
-
broadcast(child, componentName, eventName, ...params);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export { dispatch, broadcast, parent };
|
|
1
|
+
import { getCurrentInstance, type ComponentInternalInstance } from 'vue';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 适用于 uni-app Vue3 的事件派发/广播工具
|
|
5
|
+
* 用法:import { dispatch, broadcast } from './emitter'
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 向上查找父组件并派发事件
|
|
10
|
+
* @param instance 当前组件实例(setup中可用getCurrentInstance())
|
|
11
|
+
* @param componentName 目标组件名
|
|
12
|
+
* @param eventName 事件名
|
|
13
|
+
* @param params 参数
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
// 将事件名转换为驼峰格式
|
|
17
|
+
// 例如:on-form-change -> onFormChange
|
|
18
|
+
function formatToCamelCase(str: string): string {
|
|
19
|
+
return str.replace(/-([a-z])/g, function (g) {
|
|
20
|
+
return g[1].toUpperCase();
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* 向上查找父组件
|
|
26
|
+
* @param instance 当前组件实例(setup中可用getCurrentInstance())
|
|
27
|
+
* @param componentName 目标组件名
|
|
28
|
+
* @returns 父组件实例
|
|
29
|
+
*/
|
|
30
|
+
function parent(instance: ComponentInternalInstance | null | undefined = undefined, componentName: string = '') {
|
|
31
|
+
if (!instance) {
|
|
32
|
+
instance = getCurrentInstance();
|
|
33
|
+
}
|
|
34
|
+
let parent = instance && (instance.parent as ComponentInternalInstance | null | undefined);
|
|
35
|
+
|
|
36
|
+
if (!componentName) return parent;
|
|
37
|
+
while (parent) {
|
|
38
|
+
const name = (parent.type as any)?.name as string | undefined;
|
|
39
|
+
if (name === componentName) {
|
|
40
|
+
return parent;
|
|
41
|
+
}
|
|
42
|
+
parent = parent.parent;
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** * 向上查找父组件并派发事件
|
|
48
|
+
* @param instance 当前组件实例(setup中可用getCurrentInstance())
|
|
49
|
+
* @param componentName 目标组件名
|
|
50
|
+
* @param eventName 事件名
|
|
51
|
+
* @param params 参数
|
|
52
|
+
*/
|
|
53
|
+
function dispatch(
|
|
54
|
+
instance: ComponentInternalInstance | null | undefined,
|
|
55
|
+
componentName: string,
|
|
56
|
+
eventName: string,
|
|
57
|
+
...params: any[]
|
|
58
|
+
) {
|
|
59
|
+
let parent = instance && (instance.parent as ComponentInternalInstance | null | undefined);
|
|
60
|
+
while (parent) {
|
|
61
|
+
const name = (parent.type as any)?.name as string | undefined;
|
|
62
|
+
if (name === componentName) {
|
|
63
|
+
// 找到目标组件,派发事件
|
|
64
|
+
// Vue3未解决,目标组件事件监听失效,待优化,暂时使用下面的方式解决,如果你有好的方式也可以告诉我或者提PR
|
|
65
|
+
parent.emit && parent.emit(eventName, ...params);
|
|
66
|
+
// 如果有对应的方法,执行方法
|
|
67
|
+
// 这里可以考虑将 eventName 转换为驼峰格式
|
|
68
|
+
// 例如:on-form-change -> onFormChange
|
|
69
|
+
parent.exposed?.[formatToCamelCase(eventName)] && parent.exposed[formatToCamelCase(eventName)](...params);
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
parent = parent.parent;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* 向下递归查找子组件并广播事件
|
|
78
|
+
* @param instance 当前组件实例(setup中可用getCurrentInstance())
|
|
79
|
+
* @param componentName 目标组件名
|
|
80
|
+
* @param eventName 事件名
|
|
81
|
+
* @param params 参数
|
|
82
|
+
*/
|
|
83
|
+
function broadcast(
|
|
84
|
+
instance: ComponentInternalInstance | null | undefined,
|
|
85
|
+
componentName: string,
|
|
86
|
+
eventName: string,
|
|
87
|
+
...params: any[]
|
|
88
|
+
) {
|
|
89
|
+
if (!instance) return;
|
|
90
|
+
const subTree = (instance.subTree as any)?.children || [];
|
|
91
|
+
const children = Array.isArray(subTree) ? subTree : [subTree];
|
|
92
|
+
children.forEach((vnode: any) => {
|
|
93
|
+
const child = vnode.component as ComponentInternalInstance | undefined;
|
|
94
|
+
|
|
95
|
+
if (child) {
|
|
96
|
+
const name = (child.type as any)?.name as string | undefined;
|
|
97
|
+
if (name === componentName) {
|
|
98
|
+
// 找到目标组件,广播事件
|
|
99
|
+
// Vue3未解决,目标组件事件监听失效,待优化,暂时使用下面的方式解决,如果你有好的方式也可以告诉我或者提PR
|
|
100
|
+
child.emit && child.emit(eventName, ...params);
|
|
101
|
+
// 如果有对应的方法,执行方法
|
|
102
|
+
// 这里可以考虑将 eventName 转换为驼峰格式
|
|
103
|
+
// 例如:on-form-change -> onFormChange
|
|
104
|
+
child.exposed?.[formatToCamelCase(eventName)] && child.exposed[formatToCamelCase(eventName)](...params);
|
|
105
|
+
} else {
|
|
106
|
+
broadcast(child, componentName, eventName, ...params);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export { dispatch, broadcast, parent };
|
package/libs/util/eventBus.ts
CHANGED
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
// utils/eventBus.ts
|
|
2
|
-
|
|
3
|
-
// 更灵活的事件回调类型定义
|
|
4
|
-
type EventCallback = (data?: any, ...args: any[]) => void;
|
|
5
|
-
|
|
6
|
-
class EventBus {
|
|
7
|
-
private events: Map<string, EventCallback[]> = new Map();
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* 监听事件
|
|
11
|
-
*/
|
|
12
|
-
on(event: string, callback: EventCallback): void {
|
|
13
|
-
if (!this.events.has(event)) {
|
|
14
|
-
this.events.set(event, []);
|
|
15
|
-
}
|
|
16
|
-
this.events.get(event)!.push(callback);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* 一次性监听
|
|
21
|
-
*/
|
|
22
|
-
once(event: string, callback: EventCallback): void {
|
|
23
|
-
const onceCallback: EventCallback = (data, ...args) => {
|
|
24
|
-
callback(data, ...args);
|
|
25
|
-
this.off(event, onceCallback);
|
|
26
|
-
};
|
|
27
|
-
this.on(event, onceCallback);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* 触发事件
|
|
32
|
-
*/
|
|
33
|
-
emit(event: string, data?: any, ...args: any[]): void {
|
|
34
|
-
if (this.events.has(event)) {
|
|
35
|
-
this.events.get(event)!.forEach(callback => {
|
|
36
|
-
try {
|
|
37
|
-
callback(data, ...args);
|
|
38
|
-
} catch (error) {
|
|
39
|
-
console.error(`EventBus error in ${event}:`, error);
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* 取消监听
|
|
47
|
-
*/
|
|
48
|
-
off(event: string, callback?: EventCallback): void {
|
|
49
|
-
if (!this.events.has(event)) return;
|
|
50
|
-
|
|
51
|
-
if (callback) {
|
|
52
|
-
const callbacks = this.events.get(event)!;
|
|
53
|
-
const index = callbacks.indexOf(callback);
|
|
54
|
-
if (index > -1) {
|
|
55
|
-
callbacks.splice(index, 1);
|
|
56
|
-
}
|
|
57
|
-
} else {
|
|
58
|
-
this.events.delete(event);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* 检查是否有监听器
|
|
64
|
-
*/
|
|
65
|
-
has(event: string): boolean {
|
|
66
|
-
return this.events.has(event) && this.events.get(event)!.length > 0;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* 清理所有事件
|
|
71
|
-
*/
|
|
72
|
-
clear(): void {
|
|
73
|
-
this.events.clear();
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// 创建全局实例
|
|
78
|
-
export const eventBus = new EventBus();
|
|
79
|
-
|
|
80
|
-
// 热更新处理
|
|
81
|
-
if (import.meta.hot) {
|
|
82
|
-
import.meta.hot.accept(() => {
|
|
83
|
-
// 热更新时不清理事件,保持事件监听
|
|
84
|
-
console.log('EventBus hot updated');
|
|
85
|
-
});
|
|
86
|
-
}
|
|
1
|
+
// utils/eventBus.ts
|
|
2
|
+
|
|
3
|
+
// 更灵活的事件回调类型定义
|
|
4
|
+
type EventCallback = (data?: any, ...args: any[]) => void;
|
|
5
|
+
|
|
6
|
+
class EventBus {
|
|
7
|
+
private events: Map<string, EventCallback[]> = new Map();
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* 监听事件
|
|
11
|
+
*/
|
|
12
|
+
on(event: string, callback: EventCallback): void {
|
|
13
|
+
if (!this.events.has(event)) {
|
|
14
|
+
this.events.set(event, []);
|
|
15
|
+
}
|
|
16
|
+
this.events.get(event)!.push(callback);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 一次性监听
|
|
21
|
+
*/
|
|
22
|
+
once(event: string, callback: EventCallback): void {
|
|
23
|
+
const onceCallback: EventCallback = (data, ...args) => {
|
|
24
|
+
callback(data, ...args);
|
|
25
|
+
this.off(event, onceCallback);
|
|
26
|
+
};
|
|
27
|
+
this.on(event, onceCallback);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 触发事件
|
|
32
|
+
*/
|
|
33
|
+
emit(event: string, data?: any, ...args: any[]): void {
|
|
34
|
+
if (this.events.has(event)) {
|
|
35
|
+
this.events.get(event)!.forEach(callback => {
|
|
36
|
+
try {
|
|
37
|
+
callback(data, ...args);
|
|
38
|
+
} catch (error) {
|
|
39
|
+
console.error(`EventBus error in ${event}:`, error);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* 取消监听
|
|
47
|
+
*/
|
|
48
|
+
off(event: string, callback?: EventCallback): void {
|
|
49
|
+
if (!this.events.has(event)) return;
|
|
50
|
+
|
|
51
|
+
if (callback) {
|
|
52
|
+
const callbacks = this.events.get(event)!;
|
|
53
|
+
const index = callbacks.indexOf(callback);
|
|
54
|
+
if (index > -1) {
|
|
55
|
+
callbacks.splice(index, 1);
|
|
56
|
+
}
|
|
57
|
+
} else {
|
|
58
|
+
this.events.delete(event);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* 检查是否有监听器
|
|
64
|
+
*/
|
|
65
|
+
has(event: string): boolean {
|
|
66
|
+
return this.events.has(event) && this.events.get(event)!.length > 0;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* 清理所有事件
|
|
71
|
+
*/
|
|
72
|
+
clear(): void {
|
|
73
|
+
this.events.clear();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// 创建全局实例
|
|
78
|
+
export const eventBus = new EventBus();
|
|
79
|
+
|
|
80
|
+
// 热更新处理
|
|
81
|
+
if (import.meta.hot) {
|
|
82
|
+
import.meta.hot.accept(() => {
|
|
83
|
+
// 热更新时不清理事件,保持事件监听
|
|
84
|
+
console.log('EventBus hot updated');
|
|
85
|
+
});
|
|
86
|
+
}
|