UNPKG

@lesnoypudge/utils-react

Version:

lesnoypudge's utils-react

80 lines (79 loc) 2.43 kB
export declare namespace useRefManager { type MaybeCleanup = (() => void) | void | undefined; export type EffectCallback<_Value> = (value: _Value) => MaybeCleanup; export type EffectCleanup = () => void; export type Effect<_Value> = (callback: EffectCallback<_Value>) => EffectCleanup; export type RefManager<_Value> = { current: _Value; effect: Effect<_Value>; }; export type NullableRefManager<_Value> = { current: _Value | null; effect: Effect<_Value | null>; }; export type Overload = { <_Value>(initialValue: _Value): RefManager<_Value>; <_Value>(initialValue: _Value | null): RefManager<_Value | null>; <_Value = undefined>(initialValue?: undefined): RefManager<_Value | undefined>; }; export {}; } /** * This hook provides an enhanced reference object (`RefManager`) that * triggers registered effects on value change. * * The `RefManager` object includes: * - `current`: Holds the current value of the ref. * - `effect`: A stable method to register effects that run * when the ref's value changes, returning a cleanup function. * * Example usage: * * ```tsx * const ExampleComponent: FC = () => { * const refManager = useRefManager<HTMLButtonElement>(null); * const [isVisible, setIsVisible] = useState(false); * * useEffect(() => { * // Effect registration * return refManager.effect((buttonNode) => { * if (!buttonNode) return; * * const handler = () => {}; * * buttonNode.addEventListener('click', handler); * * // Cleanup will be called on re-render * // or value change * return () => { * buttonNode.removeEventListener( * 'click', * handler, * ); * }; * }); * }, [refManager]); * * useEffect(() => { * console.log(refManager.current); // null * * const id = setTimeout(() => { * setIsVisible(true); * }, 3000); * * return () => clearTimeout(id); * }, []); * * if (isVisible) { * return ( * <button ref={refManager}> * <>Content</> * </button> * ); * } * * return null; * }; * ``` */ export declare const useRefManager: useRefManager.Overload;