mirror of
https://github.com/streamich/react-use.git
synced 2026-01-18 14:06:52 +00:00
Create a version of the hook that simply throttled a value, hook that
throttles a function will be called useThrottleFn.
BREAKING CHANGE: 🧨 useThrottle is now a completely different hook
37 lines
939 B
TypeScript
37 lines
939 B
TypeScript
import {useState, useRef, useEffect} from 'react';
|
|
import useUnmount from './useUnmount'
|
|
|
|
const useThrottle = <T>(value: T, ms: number = 200) => {
|
|
const [state, setState] = useState<T>(value);
|
|
let timeout = useRef<any>(null);
|
|
const nextValue = useRef(null) as any;
|
|
const hasNextValue = useRef(0) as any;
|
|
|
|
useEffect(() => {
|
|
if (!timeout.current) {
|
|
setState(value);
|
|
const timeoutCallback = () => {
|
|
if (hasNextValue.current) {
|
|
hasNextValue.current = false;
|
|
setState(nextValue.current);
|
|
timeout.current = setTimeout(timeoutCallback, ms);
|
|
} else {
|
|
timeout.current = null;
|
|
}
|
|
};
|
|
timeout.current = setTimeout(timeoutCallback, ms);
|
|
} else {
|
|
nextValue.current = value;
|
|
hasNextValue.current = true;
|
|
}
|
|
}, [value]);
|
|
|
|
useUnmount(() => {
|
|
clearTimeout(timeout.current);
|
|
});
|
|
|
|
return state;
|
|
};
|
|
|
|
export default useThrottle;
|