はじめに
前回は React のフックを簡単にまとめました。
今回は、useNavigation + useLocation でデータの受け渡し方法を説明していきます。
以下サイト様を参考にさせていただきました。
【React】React Router v6でのuseNavigateでのStateの渡し方
前提条件
前提条件は以下の通りです。
- Windows11
- React がインストールされている
- react-create-app を使用してパッケージが作成されている
- react-router-dom が使用できる
ベースプログラム
ファイル構成は以下のようになります。
App.js
components/Home.js
components/NextPage.js
App.js
import React from "react";
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
import Home from "./components/Home";
import NextPage from "./components/NextPage";
function App() {
return (
<Router>
<Routes>
<Route path="/home" element={<Home />}></Route>
<Route path="/next-page" element={<NextPage />}></Route>
</Routes>
</Router>
)
};
export default App;
Home.js
import React from 'react'
import { useNavigate } from 'react-router-dom'
const Home = () => {
const navigate = useNavigate();
const handleClick = () => {
navigate("/next-page");
}
return (
<div>
<button onClick={handleClick}>Homeeeeeeeeeeeeeeeeeeee</button>
</div>
)
}
export default Home;
NextPage.js
import React from 'react'
const NextPage = () => {
return (
<div>
Next Page
</div>
)
}
export default NextPage
ベースプログラムの動作
localhost:3000/home は以下の画面です。
localhost:3000/next-page は以下の画面です。
やりたいこと
ベースプログラムでは、データの受け渡し方法が ここ で説明した sessionStorage しかありません。
今回は useNavigation でデータを渡し、useLocation でデータを受け取る方法について説明します。
変更後のプログラム
Home.js
import React from 'react'
import { useNavigate } from 'react-router-dom'
const Home = () => {
const navigate = useNavigate();
const handleClick = () => {
navigate("/next-page", {state:{pageData: "hello!!"}});
}
return (
<div>
<button onClick={handleClick}>Homeeeeeeeeeeeeeeeeeeee</button>
</div>
);
};
export default Home;
NextPage.js
import React, { useEffect, useState } from 'react'
import { useLocation } from 'react-router-dom'
const NextPage = () => {
const [data, setData] = useState("");
const location = useLocation();
useEffect(()=>{
setData(location.state.pageData);
}, [location]);
return (
<div>
this is page data: {data}
</div>
);
};
export default NextPage;
変更部分について
Home.js
navigate("/next-page", {state:{pageData: "hello!!"}});
navigate の第二引数に state 辞書で pageData を渡します。複数渡すことも可能です。
NextPage.js
const [data, setData] = useState("");
const location = useLocation();
useEffect(()=>{
setData(location.state.pageData);
}, [location]);
useEffect を使用してページロード時に一度だけデータを読み込みます。
location.state.pageData が実際に受け取るデータです。
ページ動作
localhost:3000/home
localhost:3000/next-page
無事に hello が表示されました。
直接 localhost:3000/next-page に飛ぶと、navigate の state を取得することができず、エラーが吐かれます。
おわりに
今回は、useNavigate を使用して、ページ間でデータの受け渡し方法を説明しました。
これを使えば sessionStorage にデータを格納することなくデータを受け渡すことが可能になります。
次回はQRコードリーダーを作成していきます。
コメント