> Какие варианты реализации debounce существуют в React для ограничения частоты вызова функции (React)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: IT-One, EPAM
Стек: React
> Пример ответа
В React для debounce можно использовать несколько подходов. Самый простой - обёртка setTimeout с clearTimeout внутри хука useCallback или useRef:
JSXimport { useCallback, useRef } from 'react';function useDebounce(callback, delay) {const timerRef = useRef(null);return useCallback((...args) => {if (timerRef.current) clearTimeout(timerRef.current);timerRef.current = setTimeout(() => callback(...args), delay);}, [callback, delay]);}
Для более сложных сценариев (например, отмена последнего вызова при размонтировании) используют useEffect с очисткой:
JSXfunction useDebouncedValue(value, delay) {const [debouncedValue, setDebouncedValue] = useState(value);useEffect(() => {const timer = setTimeout(() => setDebouncedValue(value), delay);return () => clearTimeout(timer);}, [value, delay]);return debouncedValue;}
Также можно применить готовые библиотеки: lodash.debounce (обёрнутый в useMemo для стабильности ссылки) или use-debounce (хуки useDebounce и useDebouncedCallback). Важно помнить, что при использовании debounce в обработчиках событий (например, onChange) нужно сохранять ссылку на функцию через useRef или useCallback, чтобы избежать пересоздания таймера при каждом рендере.
> Похожие задачи по frontend
Могли ли функциональные компоненты иметь состояние до появления хуков в React
Как работает хук useEffect в React
В чем смысл React Query и зачем он нужен, если можно делать fetch напрямую
Какой React хук используется для хранения предыдущего значения
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью