需求:
进程:
//eventhook
type eventName = string | Symbol
const eventMap = new Map<eventName, Array<Function>>()
const addListenerByName = (name: eventName, func: Function) => {
if (typeof func !== 'function') {
return ;
}
const listeners = eventMap.get(name) || []
if (!listeners.includes(func)) {
eventMap.set(name, [...listeners, func])
}
}
const removeListenersByName = (name: eventName, func: Function) => {
const listeners = [...(eventMap.get(name) || [])]
eventMap.set(name, listeners.filter(f => f !== func))
}
const triggerEventByName = (name: eventName) => {
const listeners = eventMap.get(name) || []
listeners.forEach(f => f())
}
type useEventReturn = {
addListener: (func: Function) => () => void, // 调用返回的Function会remove监听
removeListeners: (func: Function) => void,
triggerEvent: () => void,
}
/**
* 记得清除副作用
* @param evenetName
* @returns
*/
export const useEvent = (name: eventName = '@@init'): useEventReturn => {
return {
addListener: func => {
addListenerByName(name, func)
return () => removeListenersByName(name, func);
},
removeListeners: func => removeListenersByName(name, func),
triggerEvent: () => triggerEventByName(name),
};
}
export const UPDATEUSERDATAEVENTNAME = Symbol('event_name')
const { addListener } = useEvent(UPDATEUSERDATAEVENTNAME)
useEffect(() => addListener(() => actionRef.current?.reload()), [])
const { triggerEvent } = useEvent(UPDATEUSERDATAEVENTNAME)
useEffect(() => {
triggerEvent()
}, [userId] )
拓展