Проверяет умение эффективно фильтровать большие массивы данных на клиенте без изменения бэкенда, что важно для производительности интерфейса.
Когда бэкенд менять нельзя, вся нагрузка по фильтрации ложится на браузер. Главная задача — не блокировать главный поток и не перерисовывать весь список на каждое нажатие клавиши. Для этого комбинируют несколько приёмов: дебаунс ввода, мемоизацию вычислений, виртуализацию DOM и вынос тяжёлых операций в Web Worker.
function useDebounced(value, delay = 300) {
const [v, setV] = useState(value);
useEffect(() => {
const t = setTimeout(() => setV(value), delay);
return () => clearTimeout(t);
}, [value, delay]);
return v;
}
function List({ items }) {
const [query, setQuery] = useState('');
const debounced = useDebounced(query);
const filtered = useMemo(
() => items.filter(i => i.name.toLowerCase().includes(debounced.toLowerCase())),
[items, debounced]
);
return ;
}Если массив содержит десятки тысяч записей и фильтрация занимает больше 50 мс, стоит вынести её в Worker. Основной поток останется отзывчивым, а результат придёт через postMessage.
// worker.js
self.onmessage = ({ data }) => {
const { items, query } = data;
const result = items.filter(i => i.name.includes(query));
self.postMessage(result);
};Итог: комбинация debounce, useMemo, виртуализации и Web Worker позволяет фильтровать большие наборы данных на клиенте без изменения бэкенда и без потери отзывчивости интерфейса.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию