ブラウザ履歴操作・Linkコンポーネント・カスタムフック…「前のページに戻る」を自在に実現!

2024-06-24

Reactjs、Next.jsにおける「前のページに戻る」機能の実装方法

ブラウザの履歴操作を利用する方法

これは最もシンプルで、ブラウザの「戻る」ボタンを押下するのと同様の動作となります。

  • Reactjsの場合:
    • useHistoryフックを使用して、ブラウザ履歴を操作することができます。
    • history.goBack()メソッドを呼び出すことで、一つ前のページへ遷移できます。
import React from 'react';
import { useHistory } from 'react-router-dom';

function MyComponent() {
  const history = useHistory();

  const handleGoBack = () => {
    history.goBack();
  };

  return (
    <div>
      <button onClick={handleGoBack}>前のページへ戻る</button>
    </div>
  );
}
    import React from 'react';
    import { useRouter } from 'next/router';
    
    function MyComponent() {
      const router = useRouter();
    
      const handleGoBack = () => {
        router.back();
      };
    
      return (
        <div>
          <button onClick={handleGoBack}>前のページへ戻る</button>
        </div>
      );
    }
    

    Linkコンポーネントを利用する方法

    これは、Linkコンポーネントにasプロパティとhrefプロパティを設定することで実現できます。

    • asプロパティには、表示されるURLパスを設定します。

    この方法では、ブラウザ履歴に残らずに前のページへ遷移することができます。

    import React from 'react';
    import { Link } from 'react-router-dom';
    
    function MyComponent() {
      return (
        <div>
          <Link as="/" href="/previous-page">前のページへ戻る</Link>
        </div>
      );
    }
    

    補足

    • 上記以外にも、ライブラリなどを利用して「前のページに戻る」機能を実現する方法があります。
    • 特定の条件下でのみ前のページへ戻れるようにしたい場合は、useEffectフックなどを利用して制御を行うことができます。



      ReactjsとNext.jsにおける「前のページに戻る」機能実装のサンプルコード

      ブラウザの履歴操作を利用する方法

      import React from 'react';
      import { useHistory } from 'react-router-dom';
      
      function MyComponent() {
        const history = useHistory();
      
        const handleGoBack = () => {
          history.goBack();
        };
      
        return (
          <div>
            <button onClick={handleGoBack}>前のページへ戻る</button>
          </div>
        );
      }
      

      Next.js

      import React from 'react';
      import { useRouter } from 'next/router';
      
      function MyComponent() {
        const router = useRouter();
      
        const handleGoBack = () => {
          router.back();
        };
      
        return (
          <div>
            <button onClick={handleGoBack}>前のページへ戻る</button>
          </div>
        );
      }
      

      Linkコンポーネントを利用する方法

      Reactjs

      import React from 'react';
      import { Link } from 'react-router-dom';
      
      function MyComponent() {
        return (
          <div>
            <Link as="/" href="/previous-page">前のページへ戻る</Link>
          </div>
        );
      }
      
      import React from 'react';
      import Link from 'next/link';
      
      function MyComponent() {
        return (
          <div>
            <Link href="/previous-page">前のページへ戻る</Link>
          </div>
        );
      }
      
      • 上記のコードはあくまで一例であり、状況に合わせて適宜カスタマイズする必要があります。
      • コンポーネントやファイルパスは、実際のプロジェクトに合わせて変更してください。



      Reactjs、Next.jsにおける「前のページに戻る」機能の実装方法:その他の方法

      カスタムフックを利用する方法

      この方法は、useRefフックとuseEffectフックを組み合わせて、前のページの情報と状態を保持し、必要なタイミングで前のページへ遷移を行うというものです。

      具体的な実装方法としては、以下のようになります。

      import React, { useRef, useEffect } from 'react';
      
      function usePreviousPage() {
        const previousPageRef = useRef(null);
      
        useEffect(() => {
          previousPageRef.current = window.location.pathname;
        }, []);
      
        const goBackToPreviousPage = () => {
          const previousPage = previousPageRef.current;
          if (previousPage) {
            window.history.pushState({}, '', previousPage);
          }
        };
      
        return goBackToPreviousPage;
      }
      
      function MyComponent() {
        const goBackToPreviousPage = usePreviousPage();
      
        return (
          <div>
            <button onClick={goBackToPreviousPage}>前のページへ戻る</button>
          </div>
        );
      }
      

      状態管理ライブラリを利用する方法

      ReduxやMobXなどの状態管理ライブラリを利用して、前のページの情報と状態をグローバルに管理し、必要なタイミングで前のページへ遷移を行うという方法もあります。

      具体的な実装方法は、使用するライブラリによって異なりますが、一般的には以下の手順で行います。

      1. 状態管理ライブラリでストアを作成し、前のページの情報と状態を格納するプロパティを定義します。
      2. 各ページコンポーネントで、ストアから前のページの情報と状態を読み取り、必要な処理を行います。
      3. 「前のページへ戻る」ボタンなどのイベントハンドラで、ストアのアクションを発行し、前のページの情報と状態を更新します。
      4. ストア内の状態が更新されたことを検知したコンポーネントで、前のページへ遷移処理を行います。

      react-router-historyなどのサードパーティライブラリを利用して、「前のページに戻る」機能を簡単に実装する方法もあります。

      これらのライブラリは、ブラウザ履歴の操作や、前のページの情報へのアクセスなどの機能を提供しており、上記で紹介した方法よりも簡潔に実装することができます。

        これらの方法を状況に合わせて選択することで、より柔軟で効率的な「前のページに戻る」機能を実現することができます。


        reactjs next.js


        【React初心者向け】componentDidMountでできることとは?サンプルコードでわかりやすく解説

        状態設定のタイミングコンポーネントの状態は、this. setState() メソッドを使用して設定できます。このメソッドは、コンポーネントのレンダリングをトリガーします。componentDidMount() 内で this. setState() を呼び出すことで、コンポーネントが初めてレンダリングされる前に状態を初期化することができます。...


        【初心者向け】JavaScript・ReactJS・ESLintで発生する「ESLint Parsing error: Unexpected token」エラーの解決方法

        原因このエラーの最も一般的な原因は次のとおりです。セミコロンの欠如: JavaScript では、文の終わりにセミコロンが必要です。セミコロンが欠けている場合、このエラーが発生します。括弧の不一致: 括弧、角括弧、波括弧が正しくペアになっていない場合、このエラーが発生します。...


        Create React App で "react-scripts eject" コマンドを使うべき?

        "react-scripts eject" コマンドは、Create React App (CRA) で作成されたプロジェクトから、CRA のデフォルト設定とビルドスクリプトを取り除き、手動で設定を管理できるようにするコマンドです。CRA は、React...


        React Input onChange Lag の悩みはこれで解決!原因と対策を徹底解説

        原因この現象には、主に以下の原因が考えられます。Controlled Components vs. Uncontrolled Components:Controlled Components:入力フィールドの値を常に state で管理し、onChange イベントで値を更新します。毎回のキーストロークで state を更新し、再描画を発生させるため、処理が重くなる可能性があります。Uncontrolled Components:入力フィールドの値を DOM で管理し、ref を使用して値を取得します。state を更新しないため、再描画が発生せず、パフォーマンスが向上します。...


        JavaScriptでReactのuseStateフックを使って状態オブジェクトを賢く更新する方法

        以下、useState フックを使用して状態オブジェクトを更新およびマージする一般的な方法をいくつかご紹介します。個別プロパティの更新最も単純な方法は、個々のプロパティを直接更新することです。これは、更新するプロパティがわかっている場合に適しています。...