Debounce переводится как подавление или устранение, что относится к излишнему, ненужному вызову функций. Это метод оптимизации, согласно которому состояние не обновится, пока после последней попытки изменить состояние не пройдет некоторое время. Цель debounce — сократить количество ререндеров.
Debounce необходим в разработке приложений с каким-либо состоянием. Это относится к input и textarea, в которые юзер непрерывно вводит новые символы, тем самым перезаписывая данные в состоянии, что вызывает ререндер компонента каждый раз:
Вы должны понимать, что лишние ререндеры — это причина лагов в приложении. Когда тогда нужно вызывать updateName? Все просто:
после ввода символа в инпут должна пройти 1 секунда, прежде чем обновится состояние;
если в течение этой секунды пользовать продолжил вводить что-либо в инпут, то отсчет 1 секунды начинается снова,
когда проходит больше 1 секунды, состояние наконец обновляется.
Этот подход и называется debounce. Остается лишь надеяться, что пользователь пишет достаточно быстро, а не по одному символу в секунду, чтобы этот метод работал.
Debounce использует таймер ⌚, который нам придется использовать вместе с useRef, чтобы он случайно не ререндерился (и не сбрасывался) вместе с родителем, ведь ему нужно работать независимо от жизненного цикла родителя:
Теперь функция updateName будет сначала сбрасывать активный таймер, а затем запускать его снова со значением в 1 секунду. Вместе с тем как юзер печатает текст в input, состояние name не обновится, никаких ререндеров происходить не будет, пока он не перестанет печатать.
CallbackParam это дженерик функции, которую мы скормим хуку, вызывая его. Этот тип нужен функции call, которую нам хук предоставляет для вызова этой самой функции.
Также хук вернет функцию cancel, которая нам может вдруг понадобиться для отмены вызова фукнции вообще. Пока что у меня не было такой необходимости, но на всякий случай пусть будет 😉.