ReactJS - Пользовательские хуки: Осваивание бесконечной прокрутки
Здравствуйте,野心勃勃ые разработчики React! Сегодня мы отправимся в увлекательное путешествие в мир пользовательских хуков, особенно focusing на реализации функции бесконечной прокрутки. Как ваш доброжелательный邻居-преподаватель informatiky, я проведу вас через этот процесс шаг за шагом, обеспечивая ваше понимание каждого концепта по ходу дела. Так что возьмите любимый напиток, устройтесь поудобнее и погружайтесь с нами!
Понимание пользовательских хуков
Прежде чем мы углубимся в бесконечную прокрутку, давайте на минутку рассмотрим, что такое пользовательские хуки. В React хуки - это функции, которые позволяют вам "подключиться" к функциональным возможностям React state и lifecycle из функциональных компонентов. Пользовательские хуки - это просто функции, которые используют другие хуки и могут бытьshared между компонентами.
Представьте себе пользовательские хуки как ваш личный швейцарский армейский нож для разработок в React. Они помогают вам извлекать логику компонентов в повторно используемые функции, делая ваш код чище и более модульным.
Реализация функции бесконечной прокрутки
Теперь давайте перейдем к звезде нашего шоу: бесконечной прокрутке. Вы, вероятно, уже сталкивались с этой функцией на платформах социальных сетей или новостных сайтах, где контент продолжает загружаться по мере прокрутки вниз. Это отличной способ улучшить пользовательский опыт, предоставляя контент без перерыва и необходимости в pagination.
Основы бесконечной прокрутки
В своей основе бесконечная прокрутка включает три основных шага:
- Обнаружение, когда пользователь прокрутил до конца страницы
- Запуск запроса на загрузку больше данных
- Добавление новых данных к существующему контенту
Давайте разберем это на управляемые части и создадим наш пользовательский хук.
Реализация хука useInfiniteScroll
Мы создадим пользовательский хук под названием useInfiniteScroll
. Этот хук будет обрабатывать логику для обнаружения, когда загружать больше контента, и предоставлять нам необходимые состояния и функции для реализации бесконечной прокрутки в наших компонентах.
Вот базовая структура нашего хука:
import { useState, useEffect } from 'react';
const useInfiniteScroll = (callback) => {
const [isFetching, setIsFetching] = useState(false);
useEffect(() => {
window.addEventListener('scroll', handleScroll);
return () => window.removeEventListener('scroll', handleScroll);
}, []);
useEffect(() => {
if (!isFetching) return;
callback();
}, [isFetching]);
function handleScroll() {
if (window.innerHeight + document.documentElement.scrollTop !== document.documentElement.offsetHeight || isFetching) return;
setIsFetching(true);
}
return [isFetching, setIsFetching];
};
export default useInfiniteScroll;
Давайте разберем это по piece:
-
Мы импортируем
useState
иuseEffect
из React. Это основы нашего пользовательского хука. -
Наш
useInfiniteScroll
хук принимает функциюcallback
в качестве аргумента. Это будет функция, которая загружает больше данных при вызове. -
Мы создаем переменную состояния
isFetching
с помощьюuseState
. Это будет отслеживать, загружаем ли мы в настоящее время больше данных. -
Первый
useEffect
добавляет обработчик события прокрутки при монтировании компонента и удаляет его при демонтировании. Это是我们的 Cleanup для предотвращения утечек памяти. -
Второй
useEffect
отслеживает изменения вisFetching
. Когда он становится правдой, он вызывает нашу функциюcallback
для загрузки данных. -
Функция
handleScroll
- это место, где происходит магия. Она проверяет, прокрутили ли мы до конца страницы и не загружаем ли мы уже данные. Если оба условия выполнены, она устанавливаетisFetching
в true. -
Наконец, мы возвращаем
isFetching
иsetIsFetching
, чтобы компонент, использующий этот хук, мог получить доступ и обновить это состояние.
Теперь давайте посмотрим, как мы можем использовать этот хук в компоненте:
import React, { useState } from 'react';
import useInfiniteScroll from './useInfiniteScroll';
const InfiniteScrollComponent = () => {
const [items, setItems] = useState([]);
const [isFetching, setIsFetching] = useInfiniteScroll(fetchMoreListItems);
function fetchMoreListItems() {
// Моделирование вызова API
setTimeout(() => {
setItems(prevItems => ([...prevItems, ...Array(20).fill(0).map((_, i) => ({ id: prevItems.length + i, name: `Item ${prevItems.length + i + 1}` }))]));
setIsFetching(false);
}, 2000);
}
return (
<div>
<ul>
{items.map(item => <li key={item.id}>{item.name}</li>)}
</ul>
{isFetching && 'Загрузка дополнительных элементов списка...'}
</div>
);
};
export default InfiniteScrollComponent;
В этом компоненте:
- Мы используем наш
useInfiniteScroll
хук, передавая ему функциюfetchMoreListItems
. -
fetchMoreListItems
моделирует вызов API, добавляя 20 новых элементов в наш список через 2 секунды. - Мы отрисовываем наши элементы списка и показываем сообщение о загрузке, когда
isFetching
истинно.
И вот оно! Полностью функциональная реализация бесконечной прокрутки с использованием пользовательского хука React.
Помните, красота пользовательских хуков заключается в их повторно используемости. Теперь вы можете использовать этот useInfiniteScroll
хук в любом компоненте, который требует функциональности бесконечной прокрутки.
Заключение
Пользовательские хуки - это мощная функция в React, которая позволяет нам создавать повторно используемую логику. Реализуя бесконечную прокрутку в виде пользовательского хука, мы создали гибкое, повторно используемое решение, которое можно легко интегрировать в различные компоненты.
Продолжая ваше путешествие в мир React, продолжайте исследовать и создавать пользовательские хуки. Они excellent способ поддерживать ваш код DRY (Don't Repeat Yourself) и поддерживать чистый, модульный кодбейз.
Счастливого кодирования, и пусть ваши прокрутки будут бесконечными! ??
Метод | Описание |
---|---|
useInfiniteScroll(callback) |
Пользовательский хук для реализации бесконечной прокрутки |
useState(initialState) |
React хук для добавления состояния в функциональные компоненты |
useEffect(effect, dependencies) |
React хук для выполнения побочных эффектов в функциональных компонентах |
addEventListener(event, handler) |
Веб-API для附加 обработчика событий к элементу |
removeEventListener(event, handler) |
Веб-API для удаления обработчика событий из элемента |
setTimeout(callback, delay) |
Веб-API для выполнения функции после указанного dela |
Credits: Image by storyset