rsuite
Version:
A suite of react components
24 lines (23 loc) • 846 B
JavaScript
'use client';
import { useCallback, useRef } from 'react';
import useIsomorphicLayoutEffect from "./useIsomorphicLayoutEffect.js";
/**
* https://github.com/facebook/react/issues/14099#issuecomment-440013892
* @param {function} fn
*/
export function useEventCallback(fn) {
const ref = useRef(fn);
/**
* use useLayoutEffect instead of useEffect.
* useLayoutEffect is earlier than useEffect, sometimes we use setState and then use callback immediately,
* However the state in callback is not the latest, because useEffect is not triggered.
*/
useIsomorphicLayoutEffect(() => {
ref.current = fn;
});
return useCallback((...args) => {
var _ref$current;
return (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.call(ref, ...args);
}, []);
}
export default useEventCallback;