Blog>
Snippets

Implementing Manual Scroll Position Management

Showcase how to manually save and restore scroll positions using TanStack Router's useScrollRestoration hook in a dynamic content loading scenario.
import { useEffect } from 'react';
import { useLocation } from 'react-router-dom';

export function useManualScrollRestoration() {
  const location = useLocation();
  useEffect(() => {
    const scrollPosition = sessionStorage.getItem(location.pathname) || '0';
    window.scrollTo(0, parseInt(scrollPosition, 10));

    return () => sessionStorage.setItem(location.pathname, window.scrollY.toString());
  }, [location]);
}
This code snippet provides a custom hook `useManualScrollRestoration` for use with TanStack Router in React applications. It utilizes `useEffect` to tap into the lifecycle of route changes, leveraging the `location` object to track the pathname as a unique key. On component mount, it attempts to retrieve the saved scroll position from `sessionStorage` using the current pathname, defaults to '0' if not found, and scrolls to that position. On unmount, which occurs before transitioning to a new route, it saves the current scrollY position to `sessionStorage`, keying it by the current pathname. This ensures that the scroll restoration is specific to each route, accommodating dynamic content scenarios where the scroll height might change between visits.
// Usage within a component
function MyComponent() {
  useManualScrollRestoration();

  // Component logic and rendering
}
This piece of code demonstrates how to utilize the `useManualScrollRestoration` hook within a component. By simply calling `useManualScrollRestoration()` at the beginning of a component, the scroll position is managed based on changes in the route's location. This example emphasizes the ease of integrating manual scroll position management into any React component using TanStack Router, ensuring users return to their previous scroll position upon navigating back to a page.