Вы можете (и, вероятно, нуждаетесь) useRef
, чтобы сохранить значение между рендерами.Так же, как это предлагается для таймеров
Что-то в этом роде
const App = () => {
const [value, setValue] = useState(0)
const throttled = useRef(throttle((newValue) => console.log(newValue), 1000))
useEffect(() => throttled.current(value), [value])
return (
<button onClick={() => setValue(value + 1)}>{value}</button>
)
}
Что касается useCallback
:
Это можетработать также как
const throttled = useCallback(throttle(newValue => console.log(newValue), 1000), []);
Но если мы попытаемся воссоздать обратный вызов после изменения value
:
const throttled = useCallback(throttle(() => console.log(value), 1000), [value]);
мы можем обнаружить, что это не задерживает выполнение: после изменения value
Обратный вызов немедленно воссоздается и выполняется.
Так что я вижу, useCallback
в случае отложенного запуска не дает существенного преимущества.Это зависит от вас.
[UPD] изначально это было
const throttled = useRef(throttle(() => console.log(value), 1000))
useEffect(throttled.current, [value])
, но таким образом throttled.current
связалось с начальным value
(из 0) закрытием.Так что он никогда не менялся даже при следующих рендерах.
Так что будьте осторожны при вводе функций в useRef
из-за функции закрытия.