ScrollRestoration — это компонент, предназначенный для
управления поведением прокрутки при навигации между страницами в
приложениях на React с использованием React Router. Он позволяет
контролировать, куда будет прокручен пользователь после перехода,
обеспечивая удобный пользовательский опыт, особенно при возвращении на
предыдущие страницы.
По умолчанию, при переходе на новую страницу браузер перемещает
прокрутку в верхнюю часть документа. Однако в приложениях с динамическим
контентом или сложной маршрутизацией такое поведение не всегда
желательное. ScrollRestoration позволяет:
Компонент импортируется из пакета react-router-dom:
import { ScrollRestoration } from "react-router-dom";
В базовой конфигурации компонент добавляется в дерево маршрутов:
<BrowserRouter>
<ScrollRestoration />
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/contact" element={<Contact />} />
</Routes>
</BrowserRouter>
При такой установке ScrollRestoration автоматически
сохраняет позицию прокрутки для всех маршрутов и восстанавливает её при
возврате.
ScrollRestoration поддерживает несколько ключевых
свойств, которые позволяют детально настроить поведение прокрутки.
(location, matches) => string Позволяет определить
уникальный ключ для каждого маршрута. Используется для управления
сохранёнными позициями прокрутки. Пример:<ScrollRestoration getKey={(location) => location.pathname} />
string Позволяет задать
ключ для хранения позиций прокрутки, если требуется использовать
локальное или сессионное хранилище.<ScrollRestoration storageKey="my-app-scroll" />
(location, savedPosition) => boolean Функция, которая
возвращает true или false в зависимости от
того, нужно ли восстанавливать прокрутку. Можно использовать для
условного управления восстановлением, например, игнорируя определённые
маршруты.<ScrollRestoration
shouldRestoreScroll={(location, savedPosition) => !location.pathname.startsWith("/modal")}
/>
При использовании асинхронного контента (например, данных из API)
важно учитывать, что прокрутка восстанавливается только после
рендеринга. Для корректного восстановления позиции можно использовать
эффект useEffect и обновлять состояние после загрузки
данных:
useEffect(() => {
window.scrollTo(0, savedPosition || 0);
}, [savedPosition]);
Однако использование ScrollRestoration упрощает этот
процесс, так как он автоматически отслеживает маршруты и запоминает
позиции, если данные подгружаются до завершения перехода.
Навигация “назад” и “вперед” в браузере При возврате на предыдущий маршрут прокрутка автоматически возвращается на ту позицию, на которой пользователь находился, предотвращая неудобства при длинных страницах.
Сложные интерфейсы с вкладками Для интерфейсов с
несколькими вкладками можно назначать уникальные ключи через
getKey, чтобы каждая вкладка сохраняла свою позицию
независимо.
Модальные окна и панели Можно исключить
модальные окна из управления прокруткой, используя
shouldRestoreScroll, чтобы переход на модальные окна не
сбрасывал позицию основной страницы.
ScrollRestoration отлично сочетается с:
Routes и Route — обеспечивает управление
прокруткой при любых переходах между маршрутами.Outlet — позволяет работать с вложенными маршрутами,
сохраняя прокрутку для родительских и дочерних компонентов.getKey можно создавать уникальные сценарии для отдельных
секций приложения.BrowserRouter или HashRouter),
чтобы избежать конфликтов.getKey для сложных приложений с
динамическими маршрутами, чтобы каждая страница имела уникальную позицию
прокрутки.useLayoutEffect
совместно с ScrollRestoration.ScrollRestoration значительно упрощает контроль за
прокруткой в React-приложениях, обеспечивая плавный пользовательский
опыт при навигации, особенно в сложных SPA с динамическим контентом и
вложенной маршрутизацией.