今回の記事は初心者向けにReactでページ遷移時に値渡しを行う方法に関して詳細に解説していきます。ページ遷移と値渡しに関してはいくつかの種類があるため、それぞれのメリットを含めて解説していきます。React勉強中の方は是非参考にして見てください。
TypeScriptのReactプロジェクト作成
node等がインストールされてない方はインストールして下さい。その前提で話を進めます。
npx create-react-app sample --template typescript
まずは上記で「sample」プロジェクトを作成します。
cd sample
npm start
これでローカルサーバが立ち上がって初期画面が表示できます。
ではページ遷移と値渡しの種類に関してご紹介していきます。
Reactページ遷移方法
Reactでページ遷移を行う方法に関しては下記記事でメインで紹介しております。
最低限下記でページ遷移に必要なモジュール「react-router-dom」をインストールしておけばコードは動きます。
npm install react-router-dom @types/react-router-dom
import './App.css';
import { BrowserRouter, Route,Link, Routes } from 'react-router-dom';
// 最初に表示されている遷移元ページ
const Home = () => {
return (
<div>
<h1>
元ページ
</h1>
<Link to="/Senni">遷移</Link>
</div>
)
}
//遷移先
const Senni = () => {
return (
<div>
<h1>
遷移しました。
</h1>
</div>
)
}
// メイン画面(pathによって表示数画面を変更)
const App = () => {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/Senni" element={<Senni />} />
</Routes>
</BrowserRouter>
)
};
export default App;
まずは、Reactページ遷移時の値の受け渡しの種類に関して紹介します。
Reactページ遷移時の値渡しの種類
Reactのページ遷移時の値渡しに関してはいくつか種類があります。
- Props
- クエリパラメータ
- State渡し
- Redux
他にもあるかもですが、私が使ったことがあるのはこれくらいです。
まずは種類に関して簡単な説明をしていきます。種類はもういいという方は一つ下の章の、実装のところから実際に使用した上での解説を載せています。サンプルを動かして確認してみてください。
PropsでのReactページ遷移時の値渡し
ReactにおけるPropsは最重要と言っても過言ではないです。コンポーネントを呼び付出す際に必要な引数のようなイメージで下記のように記載します。
<Component props1={"コンポーネントの値1"} props2={"コンポーネントの値2"} />
ページ専用に呼び出したコンポーネントにPropsで値を渡すことができます。
Propsの値渡しははPropsの値が変更されたタイミングでPropsが渡されているコンポーネント全てに変化を伝播させることができるので便利です。
Propsに関してまだ理解が進んでいない方は別途記事を書いているので下記をまずは読んでみましょう。
【React】ReactにおけるPropsとは? 〜 初心者用にわかりやすく解説 〜
クエリパラメータでのReactページ遷移時の値渡し
クエリパラメータは下記のようなURLの最後にパラメータを埋め込むことです。
http://localhost:3000/testPage/パラメータ
例)http://localhost:3000/testPage/1
URLを指定してページ遷移する場合で、そのページで固有のID等が存在する場合はこちらを利用すると良いです。
もちろんそのIDを取得するメソッドがReactには存在するのでそちらを利用して値を取り出し、ページで使用することができます。
State渡しでのReactページ遷移時の値渡し
State渡しという名前が正しいかはわかりません。「useNavigator」「useLocation」を用います。
こちらはURLを指定して、ページ遷移する場合、クエリパラメータとは違ってURLには何も値が入りませんが、次のページに値を受け渡せる方法です。ID等をURLに載せたくない場合や、単一のIDなどではなくオブジェクトを受け渡す際などに利用できます。
/** クエリストリング */
http://localhost:3000/testPage/パラメータ
例)http://localhost:3000/testPage/1
/** State渡し */
http://localhost:3000/testPage
+
// 裏でState↓を渡す
state = {
Id:1
Text:"Id1"
}
ReduxでのReactページ遷移時の値渡し
戻るボタン等でページに進んだ後、再びページに戻ってくる場合がある。
入力→入力確認⇨入力に戻るなどの流れで値を保持したい場合はReduxを使用する必要があります。
React初学者はReduxはなかなか難しいため、本記事では割愛させていただきます。興味がある方は下記リンクより記事を記載してみたのでそちらをみてください。
【React】Reduxの使い方ご紹介。〜 初心者向け 〜
では次にページ遷移を行うコードをみていきましょう。
Reactページ遷移時の値渡し実装
PropsでのReactページ遷移時の値渡し実装
Props渡しでページ遷移時に値を渡すコードは下記です。
import './App.css';
import { BrowserRouter, Route,Link, Routes } from 'react-router-dom';
// 最初に表示されている遷移元ページ
const Home = () => {
return (
<div>
<h1>
元ページ
</h1>
<Link to="/Senni">遷移</Link>
</div>
)
}
// 遷移先Props
type SenniProps = {
id:number,
text:string,
}
//遷移先
const Senni:React.VFC<SenniProps> = (props) => {
return (
<div>
<h1>
遷移しました。
</h1>
<h2>ID:{props.id} テキスト{props.text}</h2>
</div>
)
}
// メイン画面(pathによって表示数画面を変更)
const App = () => {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/Senni" element={<Senni id={1} text={'ID1'} />} />
</Routes>
</BrowserRouter>
)
};
export default App;
解説をしていきます。
TypeScriptでプロジェクトを作成しているため、Propsの方も定義しています。
// 遷移先Props
type SenniProps = {
id:number,
text:string,
}
propsで渡ってきた部分を画面意表するようのコンポーネントです。
//遷移先
const Senni:React.VFC<SenniProps> = (props) => {
return (
<div>
<h1>
遷移しました。
</h1>
<h2>ID:{props.id} テキスト{props.text}</h2>
</div>
)
}
このPropsの型を指定することで、コンポーネントを利用する際にPropsを指定しないとエラーになります。
<Senni id={1} text={'ID1'} />
実際の画面は下記です。
URL:localhost:3000 → localhost:3000/Senni
クエリパラメータでのReactページ遷移時の値渡し実装
次はクエリパラメータでの値の受け渡しです。
import './App.css';
import { BrowserRouter, Route,Link, Routes, useParams } from 'react-router-dom';
// 最初に表示されている遷移元ページ
const Home = () => {
return (
<div>
<h1>
元ページ
</h1>
<Link to="/Senni/1">遷移</Link>
</div>
)
}
//遷移先
const Senni:React.VFC = () => {
// クエリストリングdえ渡ってきたID
const { id } = useParams()
return (
<div>
<h1>
遷移しました。
</h1>
<h2>{id}</h2>
</div>
)
}
// メイン画面(pathによって表示数画面を変更)
const App = () => {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/Senni/:id" element={<Senni />} />
</Routes>
</BrowserRouter>
)
};
export default App;
ルーティングは下記のように記載します。
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/Senni/:id" element={<Senni />} />
</Routes>
</BrowserRouter>
URLの末尾にキーとなる要素を先に定義しておきます。
実際に使用する場合下記のようにURLを指定します。
// id=1となる
<Link to="/Senni/1">遷移</Link>
コンポーネント内では下記の「useParams」を使用してクエリパラメータを取得します。
//遷移先
const Senni:React.VFC = () => {
// クエリストリングdえ渡ってきたID
const { id } = useParams()
return (
<div>
<h1>
遷移しました。
</h1>
<h2>{id}</h2>
</div>
)
}
URL:localhost:3000 → localhost:3000/Senni/1
State渡しでのReactページ遷移時の値渡し実装
次にState渡しです。こちらを使用する際は「useNavigator」を使用します。
import './App.css';
import { BrowserRouter, Route,Link, Routes, useParams, useNavigate, useLocation } from 'react-router-dom';
// 最初に表示されている遷移元ページ
const Home = () => {
const navigation = useNavigate()
// 遷移用ボタンアクション
const useMovePage = () => {
navigation("/Senni", { state: 2 });
}
return (
<div>
<h1>
元ページ
</h1>
<button onClick={useMovePage}>ボタン</button>
</div>
)
}
//遷移先
const Senni= () => {
// 値の取得
const location = useLocation()
const id = Number(location.state);
return (
<div>
<h1>
遷移しました。
</h1>
<h2>{id}</h2>
</div>
)
}
// メイン画面(pathによって表示数画面を変更)
const App = () => {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/Senni" element={<Senni />} />
</Routes>
</BrowserRouter>
)
};
export default App;
先ほどのコードではLinkでのページ遷移をおこなっていましたが、ボタンアクションに変更しております。
ボタンアクションを記述している遷移前のページでは「useNavigate」を使ってページ遷移時にStateに値を格納しています。
// 最初に表示されている遷移元ページ
const Home = () => {
const navigation = useNavigate()
// 遷移用ボタンアクション
const useMovePage = () => {
navigation("/Senni", { state: 2 });
}
return (
<div>
<h1>
元ページ
</h1>
<button onClick={useMovePage}>ボタン</button>
</div>
)
}
値を受け取ったページ側では「useLocation」を用いて値を取得し、ページに表示しています。
//遷移先
const Senni= () => {
// 値の取得
const location = useLocation()
const id = Number(location.state);
return (
<div>
<h1>
遷移しました。
</h1>
<h2>{id}</h2>
</div>
)
}
ReduxでのReactページ遷移時の値渡し実装
Reduxは初心者向けではないので同様に省略します。気になる方は下記記事を参考にしてみてください。
【React】Reduxの使い方ご紹介。〜 初心者向け 〜
Reactページ遷移時の値渡しまとめ
ご紹介した全ての方法は一長一短があるため、使用する上でどれを使用するかは考える必要がありそうです。
私個人の考えでは下記のような使い分けが最適かと思います。
- 主キーなどの要素が必要な場合で、主キーに秘匿性がない → クエリパラメーター
- 主キーなどの要素が必要な場合で、主キーに秘匿性がある(パスワードなど) → State渡し
- ダイアログや共通部分のページ遷移 → Props渡し
- 全ページなどに戻る際にデータを保持しておく必要がある → Redux
では今回の記事は以上です。他にも多数のReact関連の記事を記載しているので是非興味がある方はサイト内みて行ってください。
コメント