Компонент ScrollLock из библиотеки @wordpress/components используется для предотвращения прокрутки страницы при открытии модальных окон или других элементов, требующих фиксированного отображения. Этот компонент блокирует прокрутку страницы, добавляя класс lockscroll к элементам document.documentElement и document.scrollingElement.
Зачем нужен ScrollLock?
При открытии модальных окон или других всплывающих элементов пользователи могут столкнуться с тем, что страница продолжает прокручиваться, что может быть неудобно. Чтобы избежать этого, ScrollLock предоставляет простой способ заблокировать прокрутку страницы и улучшить взаимодействие с пользователем.
Основное использование ScrollLock
Пример использования компонента ScrollLock в простом приложении:
import { useState } from 'react';
import { ScrollLock, Button } from '@wordpress/components';
const MyScrollLock = () => {
const [ isScrollLocked, setIsScrollLocked ] = useState(false);
const toggleLock = () => {
setIsScrollLocked(locked => !locked);
};
return (
<div>
<Button variant="secondary" onClick={toggleLock}>
Toggle scroll lock
</Button>
{ isScrollLocked && <ScrollLock /> }
<p>
Scroll locked:
<strong>{isScrollLocked ? 'Yes' : 'No'}</strong>
</p>
</div>
);
};
Объяснение кода
useStateдля отслеживания состояния прокрутки
Мы используем хукuseStateдля создания состоянияisScrollLocked, которое будет отвечать за активность блокировки прокрутки. Это состояние определяет, включен ли компонентScrollLock.- Кнопка для включения/выключения блокировки прокрутки
Кнопка с текстом «Toggle scroll lock» позволяет пользователю переключать блокировку прокрутки. Когда пользователь нажимает кнопку, вызывается функцияtoggleLock, которая инвертирует текущее состояние блокировки прокрутки. - Компонент
ScrollLock
КомпонентScrollLockпоявляется в рендере, только если состояниеisScrollLockedистинно. Это означает, что прокрутка будет заблокирована, как только состояние станетtrue. - Информация о состоянии прокрутки
Внизу выводится информация о текущем состоянии блокировки прокрутки: «Yes» или «No», в зависимости от того, заблокирована ли прокрутка.
Описание параметров (Props)
Компонент ScrollLock не принимает параметров напрямую. Все управление состоянием прокрутки происходит через компонент-обертку, который использует ScrollLock внутри себя, как показано в примере выше.
Важные моменты
- Отсутствие контента
ScrollLockсам по себе не рендерит контент, так как его задача заключается исключительно в применении стилей для блокировки прокрутки страницы. - Применение класса lockscroll
Когда компонентScrollLockрендерится, он добавляет классlockscrollкdocument.documentElementиdocument.scrollingElement, что предотвращает прокрутку страницы. - Влияние на модальные окна и всплывающие элементы
Этот компонент особенно полезен при работе с модальными окнами или другими всплывающими элементами, которые требуют фиксированного положения на экране. ИспользованиеScrollLockпомогает обеспечить более стабильное и удобное взаимодействие с пользователем.
Пример с реальной модальной формой
Предположим, вы создаете модальное окно, которое должно быть отображено на странице. При открытии окна вы хотите заблокировать прокрутку страницы:
import { useState } from 'react';
import { ScrollLock, Button, Modal } from '@wordpress/components';
const MyModalWithScrollLock = () => {
const [ isModalOpen, setIsModalOpen ] = useState(false);
const [ isScrollLocked, setIsScrollLocked ] = useState(false);
const toggleModal = () => {
setIsModalOpen(!isModalOpen);
setIsScrollLocked(!isScrollLocked); // Блокируем или разблокируем прокрутку
};
return (
<div>
<Button variant="primary" onClick={toggleModal}>
{isModalOpen ? 'Close Modal' : 'Open Modal'}
</Button>
{isModalOpen && (
<Modal
title="My Modal"
onRequestClose={toggleModal}
isOpen={isModalOpen}
>
<div>
<p>Модальное окно с блокировкой прокрутки!</p>
<Button variant="secondary" onClick={toggleModal}>Закрыть</Button>
</div>
</Modal>
)}
{isScrollLocked && <ScrollLock />}
<p>
Scroll locked:
<strong>{isScrollLocked ? 'Yes' : 'No'}</strong>
</p>
</div>
);
};
Объяснение
isModalOpen: Состояние, которое отслеживает, открыто ли модальное окно.isScrollLocked: Состояние, которое контролирует блокировку прокрутки. Оно меняется в момент открытия или закрытия модального окна.Modal: Модальное окно из библиотеки@wordpress/components. Когда окно открыто, прокрутка страницы блокируется с помощьюScrollLock.
Заключение
Компонент ScrollLock — это полезный инструмент для блокировки прокрутки страницы, особенно при работе с модальными окнами или другими всплывающими элементами. Он помогает улучшить взаимодействие с пользователем, предотвращая нежелательную прокрутку и фокусируя внимание на модальном содержимом.