📌

【React】遷移先でページ上部から表示する方法

2024/11/30に公開

背景

現在Reactを使って開発中なのですが、ページをいくらかスクロールしてから他ページに遷移すると、画面の最上部から表示されないという使いづらさがありました。

chatGPT先生に聞いて解決したので共有します。

解決

まずは画面上部に戻る機能を作って、

ScrollToTop.jsx
import { useEffect } from "react";
import { useLocation } from "react-router-dom";

function ScrollToTop() {
  const { pathname } = useLocation();

  useEffect(() => {
    window.scrollTo(0, 0);
  }, [pathname]);

  return null;
}

export default ScrollToTop;

あとはこれを適用したいページにあてれば良いのですが、各ページにimportするのがめんどうだったので、レイアウトのファイルにあててしまいました。

MainLayout.jsx
import React from 'react';
import { Outlet } from 'react-router-dom';
import Header from '../components/Header';
import Footer from '../components/Footer';
import ScrollToTop from './ScrollToTop';

const MainLayoute = () => {
  return (
    <>
      <Header />
      <ScrollToTop />
      <main>
        <Outlet />
      </main>
      <Footer />
    </>
  )
}
export default MainLayoute

ただ、ブラウザバックしたときはスクロール量は前のままじゃないと戻った感がないので、以下のようにして画面遷移とリロードしたときのみ動作するようにしました。

ScrollToTop.jsx
import { useEffect } from "react";
import { useLocation, useNavigationType } from "react-router-dom";

function ScrollToTop() {
  const { pathname } = useLocation();
  const navigationType = useNavigationType();

  useEffect(() => {
    if (navigationType === "PUSH" || navigationType === "REPLACE") {
      window.scrollTo(0, 0);
    }
  }, [pathname, navigationType]);

  return null;
}

export default ScrollToTop;

自分の作りたいものがだんだんできていくのが楽しいです。

Discussion