公式ドキュメントでつかんだReactの核心Part1 ~React Router編~

# はじめに
どうもこんにちは！僕は現在1ヵ月本気の技術力向上を目指している現役高校生1年生です！
僕は現在udemyの教材を使ってReactの勉強をしています。その中でつまずいた箇所がいくつかあったので、まとめたいと思います。今回は前回の記事の内容(React Router)をさらに丁寧に解説していきたいと思います。

前回の記事

https://qiita.com/shunii/items/b56fa9ede8ed3fa83442

# React Routerとは
Reactで画面遷移を簡単に実装できるAPI(機能)です。

# 解説編
まず、React Routerに躓いた大きな原因は教材とバージョンが異なったことにあります。教材ではv5を使用していましたが、僕は最新バージョンであるv6を使用しました。今回の記事ではv5と比較するといったことはしませんが、基本的なことは実装できるように解説したいと思います。

サンプルコードの完成形

![ReactRouter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554025/9b71b35c-2829-9885-2678-ba0578f89d10.gif)

<font color="grey">解説のためのサンプルコードを載せます</font>
```react:Router.jsx
/* react-router-dom以外からのimport(自分で実装したもの)は割愛させて
いただきます。 */
import { Route, Routes } from "react-router-dom"

export const Router = () => {
    return (
        <Routes>
            <Route path='/' element={<Home />} />
            {/*親のパスをpathに設定 */}
            <Route path='/page1'>
                {/*パスが"/page1/~~"の~~のみ(相対パス)をpathに設定*/}
                <Route index element={<Page1/>}/>
                <Route path="detaila" element>
                <Route path="detailb">
            </Route>
        </Routes>
    )
}
```
```react:Home.jsx
export const Home = () => {
    return(
        <div>
            <h1>Home</h1>
        </div>
    )
}
```
```react:Page1.jsx
import { Link, useNavigate } from "react-router-dom"

export const Page1 = () => {
    const navigate = useNavigate();
    return(
        <div>
            <h1>Page1</h1>
            <Link to="detaila">DetailA</Link>
            <Link to="detailb">DetailB</Link>
            <button onClick={() => navigate("detaila")}>DetailA</button>
        </div>
    )
}
```
Router.jsxでルーターの設定をしています。Home.jsx, Page1.jsxに関しては画面遷移で表示するコンポーネントです。基本的にはRouter.jsxに関して解説します。
<br/>
<br/>

**1. 基本的な画面遷移の実装**

まずは、<font color="red">**Routesタグ**</font>(コンポーネントですがこれ以降もタグと記載します。)を書き、その中で各ルーティングの設定をしていきます。
そして、<font color="red">**Linkタグ**</font>を使用して、設定したルーティングへのリンクを生成します。これで実装完了！

<br/>

**2. ネストされた画面遷移(画面ごと)**

page1のルーティング設定に注目してください。
ここで<font color="red">**もっとも注目すべきはpathです！**</font>
Routeタグの中にさらにRouteタグをネストすることで、さらに一段階画面遷移を実装することが出来ます。

個人的に書きやすいなと思ったのですが、外側のRouteタグにpathを指定しておけばネストされたRouteタグに記載するパスはその

<font color="red">**相対パス**</font>

でかけてしまいます！v5と違ってここはいいなと思いました。
また、外側のRouteタグに指定したパスでコンポーネントを描画するにはサンプルコードの通り、pathの代わりに <font color="red">**index**</font> を使用します。
<br/>

**3. ボタンによる画面遷移**
Linkタグによって生成されるリンクではなく、ボタンを押すことで画面遷移を可能とする方法を解説します。

サンプルコードのPage1.jsxに注目してください。これに関しては実装がとても簡単で、
<font color="red">**useNavigate**</font>とそれが返す値である<font color="red">**navigate関数**</font>(名前は自由)
を使用するだけです。
<font color="grey">※ルーティング設定は大前提です。</font>

また、画面遷移先(Page1DetailA)から遷移元(Page1)に戻るためのボタンを実装したい場合以下のように記述することで可能となります。
```react:Page1DetailA.jsx
import { useNavigate } from "react-router-dom"

export const Page1DetailA = () => {
    const navigate = useNavigate();
    return(
        <div>
            <h1>Page1 DetailA</h1>
            <button onClick={() => navigate(-1)}>back</button>
        </div>
    )
}
```
<font color="red">**negative関数の引数を -1 とするだけ！**</font>

# 終わりに
今回の記事は少し長々と書いてしまいましたが、最後まで読んでいただきありがとうございました！お疲れ様です💦
今回の記事である程度の書き方がわかれば理解度がグンと上がると思います！開発が複雑になってくるとだんだんとそれに比例してコード量も多くなっていきますが、へこたれずに頑張っていきましょう～

Part1とタイトルにあるので察している方もいるかもしれませんが、Part2のもあります！次回はReactのコンテキストについて解説します！
ぜひ読んでみてね～～笑

# 参考
https://reactrouter.com/en/main

https://qiita.com/kazufoot21/items/635e4ff8e6b34f026c17

https://zenn.dev/longbridge/articles/65355d3fdb7939

# About Me
- X(旧Twitter)
https://twitter.com/shunii_hack