Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: debounce, input, event

Как debouncing помогает при работе с input и частыми обновлениями состояния?

Вопрос нужен, чтобы понять, умеет ли кандидат предотвращать лишние вычисления/рендеры при частых событиях вроде onChange.

Короткий ответ

Debounce откладывает выполнение функции до тех пор, пока события не прекратятся на заданное время. Это снижает количество обновлений state и ререндеров при вводе текста. Обычно debounce применяют для поиска, фильтрации и запросов к API. В результате интерфейс работает плавнее, а запросов становится меньше.

Длинный ответ

Ввод в input генерирует события очень часто: практически на каждый символ. Если на каждое событие делать тяжёлую работу (рендер, фильтрацию, запрос), приложение начнёт лагать.

Что делает debouncing

Debounce — это стратегия “выполнить позже, когда пользователь закончил”.

  • пользователь печатает → таймер постоянно сбрасывается

  • пользователь остановился → таймер истёк → функция выполнилась

Это отличается от throttle, где выполнение происходит “не чаще раза в N мс”.

Типичные случаи использования

  1. Поиск по мере ввода

    • не делать запрос на каждый символ

  2. Фильтрация большого списка

    • не пересчитывать фильтр при каждом вводе

  3. Автосохранение черновика

    • сохранять после паузы

Пример debounce без библиотек

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 либо для запроса, либо для вычислений

Важный момент про состояние и UX

Если делать debounce прямо на setState поля ввода, можно получить плохой UX:

  • поле “отстаёт” от ввода

  • курсор ведёт себя странно

  • кажется, что приложение лагает

Чаще правильнее:

  • ввод отображать мгновенно

  • дебаунсить эффект (запрос/фильтрацию), а не сам ввод

Типичные ошибки

  1. Создание debounce-функции на каждый рендер

    • тогда таймеры будут сбрасываться непредсказуемо

    • решение: стабилизировать функцию через useMemo / useCallback

  2. Забыть очистить таймер при unmount

    • может привести к обновлению состояния после размонтирования

    • решение: cleanup в useEffect

Краткий вывод

Debounce нужен, чтобы уменьшить количество тяжёлых операций при частых событиях и сделать UI более плавным. В React обычно обновляют значение input сразу, а debounce применяют к побочным действиям: фильтрации, запросам, автосохранению.

Уровень

  • Рейтинг:

    5

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#debounce

#input

#event

Подпишись на React Developer в телеграм