Дебаунсинг и троттлинг — два важных паттерна обработки событий, часто используемых для оптимизации работы с производительными операциями, такими как запросы на сервер или обработка пользовательского ввода. Оба подхода позволяют уменьшить частоту вызова функций в ответ на события, что способствует улучшению производительности, особенно при взаимодействии с элементами интерфейса.
Дебаунсинг (debouncing) заключается в том, что функция будет вызвана только после того, как событие прекратится на заданное время. Это особенно полезно, когда нужно избежать излишней обработки событий, например, при вводе текста в поле поиска. Каждый новый ввод вызывает перезапуск таймера, и функция срабатывает только тогда, когда ввод прекращается на достаточно длительный промежуток времени.
В контексте Petite-Vue, дебаунсинг может использоваться для управления частотой обновлений модели или асинхронных запросов, связанных с пользовательским взаимодействием.
import { defineComponent, ref, watch } FROM 'petite-vue';
const SearchInput = defineComponent({
setup() {
const query = ref('');
const debouncedQuery = ref('');
// Дебаунсинг
let timeout;
watch(query, (newQuery) => {
clearTimeout(timeout);
timeout = setTimeout(() => {
debouncedQuery.value = newQuery;
}, 500); // задержка в 500 мс
});
return { query, debouncedQuery };
},
});
В этом примере query — это модель данных, связанная с
полем ввода, а debouncedQuery будет обновляться только
после того, как пользователь прекратит вводить текст на 500
миллисекунд.
Троттлинг (throttling) используется для ограничения частоты вызова функции. В отличие от дебаунсинга, который ждет окончания активности, троттлинг позволяет функции вызываться с фиксированным интервалом. Это полезно, когда нужно контролировать частоту событий, таких как прокрутка страницы или изменение размера окна.
При использовании троттлинга события обрабатываются только через фиксированный промежуток времени, что позволяет уменьшить нагрузку на систему и избежать чрезмерных вычислений, связанных с интенсивными операциями.
import { defineComponent, ref, onMounted } FROM 'petite-vue';
const ScrollComponent = defineComponent({
setup() {
const scrollPosition = ref(0);
// Троттлинг
let lastCall = 0;
const throttle = (func, LIMIT) => {
return function () {
const now = new Date().getTime();
if (now - lastCall >= LIMIT) {
func();
lastCall = now;
}
};
};
const handleScroll = throttle(() => {
scrollPosition.value = window.scrollY;
}, 100); // вызов функции не чаще, чем раз в 100 мс
onMounted(() => {
window.addEventListener('scroll', handleScroll);
});
return { scrollPosition };
},
});
В данном примере handleScroll обновляет
scrollPosition только с заданным интервалом в 100
миллисекунд, что эффективно ограничивает частоту обработки события
прокрутки.
Оба подхода служат для улучшения производительности, но используются в разных контекстах в зависимости от того, необходимо ли обработать событие только в конце активности или нужно ограничить его частоту.
Petite-Vue сама по себе не предоставляет встроенные методы для
дебаунсинга или троттлинга, однако благодаря гибкости Vue Composition
API и возможности использования реактивных состояний, можно легко
реализовать эти паттерны с помощью таких инструментов, как
watch и обычных JavaScript-функций. Реализация этих
подходов не требует внешних зависимостей, что делает их идеальными для
легковесных приложений, построенных с использованием Petite-Vue.