【发布时间】:2022-01-07 13:51:12
【问题描述】:
这大概可以通过一个简单的实验来验证。我想知道我是否可以让一个钩子提供新的钩子。例如给定以下订阅管理器
export interface SubscriptionManager<T = any> {
/**
*
* @param fn function to call when notified. It can be passed some data
* @returns unsubscribe callback.
*/
subscribe(fn: (data: T) => void): () => void;
/**
* Notify subscribers
* @param data optionally pass data to the subscribers.
*/
notify(data?: T): void;
}
/**
* This hook provides a simple subscription semantic to React components.
*/
export function useSubscription<T = any>(): SubscriptionManager<T> {
const subscribersRef = useRef<((data: T) => void)[]>([]);
function subscribe(fn: (data: T) => void) {
subscribersRef.current.push(fn);
return () => {
subscribersRef.current = subscribersRef.current.filter(
(subscription) => !Object.is(subscription, fn)
);
};
}
function notify(data: T) {
subscribersRef.current.forEach((fn) => fn(data));
}
return { subscribe, notify };
}
我想生成一个钩子useSubcriptionEffect(fn),以防止编写这样的样板代码
useEffect(() => subscribe(fn), []);
Rules of Hooks只讲“通话”,不讲“创作”
【问题讨论】:
-
我不太确定我是否按照提供的代码 sn-p 遵循您的问题。
useSubcriptionEffect没有返回任何自定义钩子,它只是返回一个有效的对象(即认为useMemo、useCallback、useState、useReducer等... )。 编辑好的,我现在明白你在问什么......你想抽象出必要的useEffect钩子调用。 -
基本上试图做这样的事情。函数 useSubscribeEffect(fn: (data: T) => void) { useEffect(() => subscribe(fn), []); }
标签: javascript reactjs typescript react-hooks