82 lines
1.9 KiB
TypeScript
82 lines
1.9 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 };
|
|
|
|
/**
|
|
* isLogin 的数据类型
|
|
*/
|
|
export type IIsLogin = boolean;
|
|
|
|
export const Subscribe = {
|
|
/**
|
|
* 设置
|
|
* @param key 订阅变量的key
|
|
* @param value 值
|
|
*/
|
|
set<T>(key: string, value: T) {
|
|
// 1. 执行原有的存储操作
|
|
// setStorage(key, value);
|
|
// 2. 触发自定义事件,通知订阅者
|
|
triggerEvent(key, value);
|
|
},
|
|
|
|
// get(key: string) {
|
|
// return getStorage(key);
|
|
// },
|
|
|
|
/**
|
|
* 批量移除订阅
|
|
* @param key 订阅变量的key
|
|
*/
|
|
remove(key: string) {
|
|
triggerEvent(key, null); // 或者触发一个 'remove' 事件
|
|
},
|
|
|
|
/**
|
|
* 订阅事件
|
|
* @param key 订阅变量的key
|
|
* @param functionKey 唯一的函数key(用于取消订阅的)
|
|
* @param callback 回调函数
|
|
*/
|
|
on<T>(key: string, functionKey: string, callback: (data: T) => 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];
|
|
}
|
|
},
|
|
};
|