73 lines
1.8 KiB
TypeScript
73 lines
1.8 KiB
TypeScript
// 存储一个事件回调数组
|
|
const listeners: { [key: string]: any[] } = {};
|
|
|
|
// 触发事件的函数
|
|
function triggerEvent(key: string, data: any) {
|
|
if (listeners[key]) {
|
|
listeners[key].forEach((callback: any) => {
|
|
callback(data);
|
|
});
|
|
}
|
|
// 也可以触发一个通用的 'change' 事件
|
|
if (listeners["change"]) {
|
|
listeners["change"].forEach((callback: any) => {
|
|
callback({ key, data });
|
|
});
|
|
}
|
|
}
|
|
|
|
type IFun = Function & { $$functionKey?: string };
|
|
|
|
export const Subscribe = {
|
|
/**
|
|
* 设置
|
|
* @param key 订阅变量的key
|
|
* @param value 值
|
|
*/
|
|
set(key: string, value: any) {
|
|
// 1. 执行原有的存储操作
|
|
// setStorage(key, value);
|
|
// 2. 触发自定义事件,通知订阅者
|
|
triggerEvent(key, value);
|
|
},
|
|
|
|
// get(key: string) {
|
|
// return getStorage(key);
|
|
// },
|
|
|
|
remove(key: string) {
|
|
triggerEvent(key, null); // 或者触发一个 'remove' 事件
|
|
},
|
|
|
|
/**
|
|
* 订阅事件
|
|
* @param key 订阅变量的key
|
|
* @param functionKey 唯一的函数key(用于取消订阅的)
|
|
* @param callback 回调函数
|
|
*/
|
|
on(key: string, functionKey: string, callback: () => void) {
|
|
if (!listeners[key]) {
|
|
listeners[key] = [];
|
|
}
|
|
if (typeof callback == "function") {
|
|
(callback as IFun)["$$functionKey"] = functionKey;
|
|
listeners[key].push(callback);
|
|
} else {
|
|
console.log("订阅事件 callback 必须是函数");
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 取消订阅
|
|
* @param key 订阅变量的key
|
|
* @param functionKey 唯一的函数key(用于取消订阅的)
|
|
*/
|
|
off(key: string, functionKey: string) {
|
|
if (!listeners[key]) return;
|
|
listeners[key] = listeners[key].filter((cb: IFun) => cb.$$functionKey != functionKey);
|
|
if (listeners[key].length == 0) {
|
|
delete listeners[key];
|
|
}
|
|
},
|
|
};
|