Этот вопрос проверяет понимание методов дебаунсинга и троттлинга, которые используются для управления частотой вызовов функций.
Дебаунсинг и троттлинг — это техники, которые ограничивают количество вызовов функции, чтобы улучшить производительность приложений. Дебаунсинг задерживает выполнение функции до тех пор, пока не прекратится серия вызовов, тогда как троттлинг позволяет выполнять функцию с фиксированной частотой. Оба метода полезны в ситуациях, таких как обработка ввода пользователя или события прокрутки.
Дебаунсинг и троттлинг — это две техники, используемые для управления частотой вызовов функций в JavaScript и React. Они особенно полезны для обработки событий, которые могут вызывать множество вызовов функции за короткий промежуток времени, таких как ввод текста в поле или прокрутка страницы.
Эта техника отменяет вызов функции, если в течение заданного времени происходит новое событие. Это означает, что функция будет вызвана только после завершения серии вызовов. Это полезно, например, при поиске в реальном времени, когда вы хотите отправить запрос на сервер только после того, как пользователь закончит ввод.
Пример реализации дебаунсинга с использованием хуков:
import React, { useState, useEffect } from 'react';
function DebounceExample() {
const [searchTerm, setSearchTerm] = useState('');
const [debouncedTerm, setDebouncedTerm] = useState(searchTerm);
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedTerm(searchTerm);
}, 300);
return () => {
clearTimeout(handler);
};
}, [searchTerm]);
return (
<div>
<input
type="text"
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
/>
<p>Дебаунсированный термин: {debouncedTerm}</p>
</div>
);
}Эта техника ограничивает вызов функции до одного раза за определенный промежуток времени. Это означает, что функция будет вызываться на регулярной основе, независимо от того, как часто происходит событие.
Пример реализации троттлинга с использованием хуков:
import React, { useState, useEffect } from 'react';
function ThrottleExample() {
const [count, setCount] = useState(0);
useEffect(() => {
const handleScroll = () => {
setCount(prevCount => prevCount + 1);
};
const throttledHandleScroll = throttle(handleScroll, 1000);
window.addEventListener('scroll', throttledHandleScroll);
return () => {
window.removeEventListener('scroll', throttledHandleScroll);
};
}, []);
return <p>Количество прокруток: {count}</p>;
}
function throttle(func, limit) {
let lastFunc;
let lastRan;
return function() {
const context = this;
const args = arguments;
if (!lastRan) {
func.apply(context, args);
lastRan = Date.now();
} else {
clearTimeout(lastFunc);
lastFunc = setTimeout(() => {
if (Date.now() - lastRan >= limit) {
func.apply(context, args);
lastRan = Date.now();
}
}, limit - (Date.now() - lastRan));
}
};
}Обе техники помогают улучшить производительность, управляя частотой вызовов функций и избегая избыточной нагрузки на приложение.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию