ReactJS - Пользовательские хуки: Осваивание бесконечной прокрутки

Здравствуйте,野心勃勃ые разработчики React! Сегодня мы отправимся в увлекательное путешествие в мир пользовательских хуков, особенно focusing на реализации функции бесконечной прокрутки. Как ваш доброжелательный邻居-преподаватель informatiky, я проведу вас через этот процесс шаг за шагом, обеспечивая ваше понимание каждого концепта по ходу дела. Так что возьмите любимый напиток, устройтесь поудобнее и погружайтесь с нами!

ReactJS - Custom Hooks

Понимание пользовательских хуков

Прежде чем мы углубимся в бесконечную прокрутку, давайте на минутку рассмотрим, что такое пользовательские хуки. В React хуки - это функции, которые позволяют вам "подключиться" к функциональным возможностям React state и lifecycle из функциональных компонентов. Пользовательские хуки - это просто функции, которые используют другие хуки и могут бытьshared между компонентами.

Представьте себе пользовательские хуки как ваш личный швейцарский армейский нож для разработок в React. Они помогают вам извлекать логику компонентов в повторно используемые функции, делая ваш код чище и более модульным.

Реализация функции бесконечной прокрутки

Теперь давайте перейдем к звезде нашего шоу: бесконечной прокрутке. Вы, вероятно, уже сталкивались с этой функцией на платформах социальных сетей или новостных сайтах, где контент продолжает загружаться по мере прокрутки вниз. Это отличной способ улучшить пользовательский опыт, предоставляя контент без перерыва и необходимости в pagination.

Основы бесконечной прокрутки

В своей основе бесконечная прокрутка включает три основных шага:

  1. Обнаружение, когда пользователь прокрутил до конца страницы
  2. Запуск запроса на загрузку больше данных
  3. Добавление новых данных к существующему контенту

Давайте разберем это на управляемые части и создадим наш пользовательский хук.

Реализация хука 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:

  1. Мы импортируем useState и useEffect из React. Это основы нашего пользовательского хука.

  2. Наш useInfiniteScroll хук принимает функцию callback в качестве аргумента. Это будет функция, которая загружает больше данных при вызове.

  3. Мы создаем переменную состояния isFetching с помощью useState. Это будет отслеживать, загружаем ли мы в настоящее время больше данных.

  4. Первый useEffect добавляет обработчик события прокрутки при монтировании компонента и удаляет его при демонтировании. Это是我们的 Cleanup для предотвращения утечек памяти.

  5. Второй useEffect отслеживает изменения в isFetching. Когда он становится правдой, он вызывает нашу функцию callback для загрузки данных.

  6. Функция handleScroll - это место, где происходит магия. Она проверяет, прокрутили ли мы до конца страницы и не загружаем ли мы уже данные. Если оба условия выполнены, она устанавливает isFetching в true.

  7. Наконец, мы возвращаем 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;

В этом компоненте:

  1. Мы используем наш useInfiniteScroll хук, передавая ему функцию fetchMoreListItems.
  2. fetchMoreListItems моделирует вызов API, добавляя 20 новых элементов в наш список через 2 секунды.
  3. Мы отрисовываем наши элементы списка и показываем сообщение о загрузке, когда 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