Files
FreeERP.Applet/miniprogram/utils/subscribe.ts
2025-11-28 16:49:36 +08:00

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];
}
},
};