Вопрос нужен, чтобы понять, умеет ли кандидат предотвращать лишние вычисления/рендеры при частых событиях вроде onChange.
Debounce откладывает выполнение функции до тех пор, пока события не прекратятся на заданное время. Это снижает количество обновлений state и ререндеров при вводе текста. Обычно debounce применяют для поиска, фильтрации и запросов к API. В результате интерфейс работает плавнее, а запросов становится меньше.
Ввод в input генерирует события очень часто: практически на каждый символ. Если на каждое событие делать тяжёлую работу (рендер, фильтрацию, запрос), приложение начнёт лагать.
Debounce — это стратегия “выполнить позже, когда пользователь закончил”.
пользователь печатает → таймер постоянно сбрасывается
пользователь остановился → таймер истёк → функция выполнилась
Это отличается от throttle, где выполнение происходит “не чаще раза в N мс”.
Поиск по мере ввода
не делать запрос на каждый символ
Фильтрация большого списка
не пересчитывать фильтр при каждом вводе
Автосохранение черновика
сохранять после паузы
function debounce(fn, delay) {
let t
return (...args) => {
clearTimeout(t)
t = setTimeout(() => fn(...args), delay)
}
}
Применение в React обычно выглядит как разделение:
inputValue обновляется сразу (чтобы UI был отзывчивым)
“debouncedValue” обновляется реже (для тяжёлых действий)
const [value, setValue] = useState('')
const onChange = (e) => setValue(e.target.value)
// дальше: debounce либо для запроса, либо для вычислений
Если делать debounce прямо на setState поля ввода, можно получить плохой UX:
поле “отстаёт” от ввода
курсор ведёт себя странно
кажется, что приложение лагает
Чаще правильнее:
ввод отображать мгновенно
дебаунсить эффект (запрос/фильтрацию), а не сам ввод
Создание debounce-функции на каждый рендер
тогда таймеры будут сбрасываться непредсказуемо
решение: стабилизировать функцию через useMemo / useCallback
Забыть очистить таймер при unmount
может привести к обновлению состояния после размонтирования
решение: cleanup в useEffect
Debounce нужен, чтобы уменьшить количество тяжёлых операций при частых событиях и сделать UI более плавным. В React обычно обновляют значение input сразу, а debounce применяют к побочным действиям: фильтрации, запросам, автосохранению.