web-component-gallery 2.0.13 → 2.0.15
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/lib/style/page.less +1 -1
- package/package.json +1 -1
- package/utils/EventAutoDisposer.js +88 -0
package/lib/style/page.less
CHANGED
package/package.json
CHANGED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
const EventAutoDisposer = {
|
|
2
|
+
install(Vue) {
|
|
3
|
+
const vm = new Vue()
|
|
4
|
+
const componentListeners = new WeakMap()
|
|
5
|
+
const windowEventListeners = new WeakMap()
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 设置销毁钩子
|
|
9
|
+
* @param {VueComponent} target 目标组件
|
|
10
|
+
* @param {WeakMap<Object, Map<Function, Function>>} listenersMap 监听器映射
|
|
11
|
+
*/
|
|
12
|
+
function setupDisposeHook(target, listenersMap) {
|
|
13
|
+
if (target.$options && target.$options.beforeDestroy) {
|
|
14
|
+
const originalDestroy = target.$options.beforeDestroy || (() => {})
|
|
15
|
+
target.$options.beforeDestroy = function() {
|
|
16
|
+
originalDestroy.call(this)
|
|
17
|
+
this[`${listenersMap === componentListeners ? 'event' : 'window'}BusDisposer`]?.()
|
|
18
|
+
}.bind(target)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* 统一的事件监听器注册逻辑
|
|
24
|
+
* @param {VueComponent} target 目标组件
|
|
25
|
+
* @param {string} event 事件名称
|
|
26
|
+
* @param {Function} callback 回调函数
|
|
27
|
+
* @param {Object} disposer 事件发射器(vm或window)
|
|
28
|
+
* @param {WeakMap<Object, Map<Function, Function>>} listenersMap 监听器映射
|
|
29
|
+
* @returns {Function} 返回清理函数
|
|
30
|
+
*/
|
|
31
|
+
function registerListener(target, event, callback, disposer, listenersMap) {
|
|
32
|
+
if (!listenersMap.has(target)) {
|
|
33
|
+
listenersMap.set(target, new Map())
|
|
34
|
+
setupDisposeHook(target, listenersMap)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const eventRemover = () => disposer[listenersMap === componentListeners ? '$off' : 'removeEventListener'](event, callback)
|
|
38
|
+
const listeners = listenersMap.get(target)
|
|
39
|
+
listeners.set(callback, eventRemover)
|
|
40
|
+
|
|
41
|
+
if (target.$options && target.$options.beforeDestroy) {
|
|
42
|
+
target[`${listenersMap === componentListeners ? 'event' : 'window'}BusDisposer`] = () => {
|
|
43
|
+
listeners.forEach(dispose => dispose())
|
|
44
|
+
listeners.clear()
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
disposer[listenersMap === componentListeners ? '$on' : 'addEventListener'](event, callback)
|
|
49
|
+
return eventRemover
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// 组件事件监听
|
|
53
|
+
function $on(component, event, callback) {
|
|
54
|
+
return registerListener(component, event, callback, vm, componentListeners)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// 窗口事件监听
|
|
58
|
+
function $onWindow(component, event, callback) {
|
|
59
|
+
return registerListener(component, event, callback, window, windowEventListeners)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// 事件发射
|
|
63
|
+
function $emit(event, ...args) {
|
|
64
|
+
vm.$emit(event, ...args)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// 全局销毁
|
|
68
|
+
function dispose() {
|
|
69
|
+
vm.$off()
|
|
70
|
+
componentListeners = new WeakMap()
|
|
71
|
+
windowEventListeners = new WeakMap()
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// 挂载到Vue原型
|
|
75
|
+
Vue.prototype.$bus = {
|
|
76
|
+
$on, // 组件事件监听
|
|
77
|
+
$onWindow, // 窗口事件监听
|
|
78
|
+
$emit, // 事件发射
|
|
79
|
+
dispose, // 全局销毁
|
|
80
|
+
$offFor: (component, event, callback) => { // 取消特定事件注册
|
|
81
|
+
const disposer = componentListeners.get(component)?.get(callback)
|
|
82
|
+
if (disposer) disposer()
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export default EventAutoDisposer
|