参考になりそうなコードをみつけたので回答します。
まだ不安定(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
関数の中で補足できています。