質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Router

Routerは、異なるネットワーク同士を相互に接続するための通信機器。インターネットでのデータを自動的に振り分け、一つのインターネット回線を複数のコンピュータで使用することが可能です。DHCPによりIPアドレスを自動的に割振りすることもできます。

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

1回答

6396閲覧

React ブラウザの戻るボタンを検知したい

shunta80

総合スコア96

Router

Routerは、異なるネットワーク同士を相互に接続するための通信機器。インターネットでのデータを自動的に振り分け、一つのインターネット回線を複数のコンピュータで使用することが可能です。DHCPによりIPアドレスを自動的に割振りすることもできます。

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2022/06/13 10:38

前提

React-Routerでページ遷移を実装している

実現したいこと

戻るボタンで前のページに戻った時に検知してイベント発火→ページを再読み込みしたい

発生している問題・エラーメッセージ

addEventListenerを使った方法は見つけたがレンダリングが多くなってしまう
せっかくReactを使用しているのでReact-Routerを使用した方法はないのか

該当のソースコード

window.addEventListener('popstate',e=>{   console.log('レンダリング') window.location.reload(); }) });

試したこと

addEventListenerを使用した方法しか記事がなかった

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2022/06/13 13:27

React でページ再読み込みは悪手ですね。react router で普通に画面遷移を実装すれば、戻るボタンに限らず表示内容が更新される (ように作る) と思いますけど…。
guest

回答1

0

参考になりそうなコードをみつけたので回答します。
まだ不安定(UNSAFE)とされているAPIを使う点が若干気になりますが、stackoverflowのこの質問

に対するこの回答👉 https://stackoverflow.com/a/71399121
をちょっと試してみました。

teratail の別の質問への私の回答 の中の追記 に書いたコンポーネントを流用しつつ、App.js に以下のコードを追加します。

diff

1 import './App.css'; 2-import { BrowserRouter, Routes, Route } from 'react-router-dom'; 3+import { useContext, useEffect } from 'react'; 4+import { BrowserRouter, Routes, Route, UNSAFE_NavigationContext } from 'react-router-dom'; 5 import { 6 About, 7 Footer, 8 Header, 9 Home, 10 Service 11 } from './components'; 12 13+const useBackListener = (callback) => { 14+ const navigator = useContext(UNSAFE_NavigationContext).navigator; 15+ 16+ useEffect(() => { 17+ const listener = ({ location, action }) => { 18+ console.log("listener", { location, action }); 19+ if (action === "POP") { 20+ callback({ location, action }); 21+ } 22+ }; 23+ const unlisten = navigator.listen(listener); 24+ return unlisten; 25+ }, [callback, navigator]); 26+}; 27+ 28+const HeaderWithListener = () => { 29+ useBackListener(({ location, action }) => { 30+ console.log(location, action); 31+ }); 32+ 33+ return <Header />; 34+} 35+ 36 const App = () => { 37 return ( 38 <div className="App"> 39 <BrowserRouter> 40- <Header /> 41+ <HeaderWithListener /> 42 <Routes> 43 <Route path={"/"} element={<Home/>} /> 44 <Route path={"/about"} element={<About/>} />

上記のdiffのコードを追加した後、ヘッダのリンクを Home 、Abount、Service の順にクリックした後、ブラウザの戻るボタンをクリックしたときのコンソール表示が以下です。

イメージ説明

戻るボタンを押したときに発生するPOPイベントが const listener 関数の中で補足できています。

イメージ説明

投稿2022/06/13 21:51

編集2022/06/13 22:15
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問