# ログイン画面の作成1

次はログイン画面を作成していきます。

`feature/login-page`にて作業します。

```bash
git switch -c feature/login-page
```

`pages`配下に`LoginPage.tsx`を作成し、`rafc`を入力して、`Enter`を押しましょう。

<pre class="language-tsx" data-title="pages/LoginPage.tsx◎"><code class="lang-tsx"><strong>export const LoginPage = () => {
</strong><strong>  return (
</strong><strong>    &#x3C;div>LoginPage&#x3C;/div>
</strong><strong>  )
</strong><strong>}
</strong>
</code></pre>

ここでURLにて、`/`とした際はTopページを表示し、`/login`とした際はログインページを表示するようにします。

そのため`react-router-dom`をインストールします。

```bash
npm i react-router-dom
```

次に、`src`配下に`routes.tsx`を作成します。

その中で`react-router-dom`の`createBrowserRouter`を使用し、以下のように`router`を定義します。

{% code title="src/routes.tsx◎" %}

```tsx
import { createBrowserRouter } from "react-router-dom";
import { TopPage } from "./components/pages/TopPage";
import { LoginPage } from "./components/pages/LoginPage";

export const router = createBrowserRouter([
  { path: "/", element: <TopPage /> },
  { path: "/login", element: <LoginPage /> },
]);
```

{% endcode %}

このように記述することで、`/`とした際はTopページが表示され、`/login`とした際はログインページが表示されるようになります。

そしてmain.tsxにて、`RouterProvider`を呼び出し、先ほど作成した`router`を渡すことで準備は完了です。

<pre class="language-tsx" data-title="src/main.ts◎"><code class="lang-tsx">import React from 'react'
import ReactDOM from 'react-dom/client'
<strong>import { RouterProvider } from "react-router-dom";
</strong>import './styles/index.css'
import "./styles/output.css"
import "./styles/destyle.css";
<strong>import { router } from './routes';
</strong>
ReactDOM.createRoot(document.getElementById("root")!).render(
  &#x3C;React.StrictMode>
<strong>    &#x3C;RouterProvider router={router} />
</strong>  &#x3C;/React.StrictMode>
);

</code></pre>

実際にブラウザにてurlを`/`、`/login`と入力することでページが変わることが確認できるかと思います。

また、`createBrowserRouter`にて共通するレイアウトを設定することができ、`element`に共通するレイアウトのコンポーネントをセットし、`children`に`path`とそれに対応する`element`を配列の形で渡すことで、childrenに渡した全てのページにて、`element`（以下の場合は、NotLoginLayoutのコンポーネント）のコンポーネントが表示されることができます。

<pre class="language-tsx" data-title="src/routes.tsx◎"><code class="lang-tsx">import { createBrowserRouter } from "react-router-dom";
import { TopPage } from "./components/pages/TopPage";
import { LoginPage } from "./components/pages/LoginPage";
import { NotLoginLayout } from "./components/templates/NotLoginLayouts";

export const router = createBrowserRouter([
<strong>  {
</strong><strong>    path: "/",
</strong><strong>    element: &#x3C;NotLoginLayout />,
</strong><strong>    children: [
</strong><strong>      { index: true, element: &#x3C;TopPage /> },
</strong><strong>      { path: "/login", element: &#x3C;LoginPage /> },
</strong><strong>    ],
</strong><strong>  },
</strong>]);

</code></pre>

そして、NotLoginLayoutコンポーネントにr`eact-router-dom`の`Outlet`を呼び出すことで、`<Outlet />`の部分に各パスの`element`が埋め込まれるようになります。

(`/`の場合は`<TopPage />`、`/login`の場合は`<LoginPage />`が埋め込まれます。)

<pre class="language-tsx" data-title="src/routes.tsx◎"><code class="lang-tsx"><strong>import { Outlet } from "react-router-dom";
</strong>
<strong>export const NotLoginLayout = () => {
</strong>  return (
    &#x3C;div className="relative">
      &#x3C;header className="bg-white leading-[50px] fixed top-0 left-0 right-0">
        &#x3C;div className="container mx-auto flex justify-between">
          &#x3C;p className="logo">スケジュール管理APP&#x3C;/p>
          &#x3C;nav>
            &#x3C;ul className="flex gap-5 text-lime-800">
              &#x3C;li>ご利用方法&#x3C;/li>
              &#x3C;li>ログイン&#x3C;/li>
            &#x3C;/ul>
          &#x3C;/nav>
        &#x3C;/div>
      &#x3C;/header>
      &#x3C;main className="pt-[50px] bg-gradient-to-r from-lime-100 to-lime-200 h-screen flex flex-col justify-center items-center">
<strong>        &#x3C;Outlet />
</strong>      &#x3C;/main>
    &#x3C;/div>
  );
}
</code></pre>

上記のように編集したので、`TopPage.tsx`のNotLoginLayoutを削除しましょう。

{% code title="pages/TopPage.tsx◎" %}

```tsx
import { PrimaryBtn } from "../atoms/PrimaryBtn";

export const TopPage = () => {
  return (
    <div className="text-center">
      <h1 className="text-7xl logo">スケジュール管理APP</h1>
      <p className="pt-[10vh] text-5xl">
        お互いのスケジュールを管理するアプリです
      </p>
      <div className="pt-[20vh]">
        <PrimaryBtn>ログイン</PrimaryBtn>
      </div>
    </div>
  );
}
```

{% endcode %}

ここまでの作業をcommitしましょう。

```bash
git add .
```

```bash
git commit
```

commitメッセージは

```
feat: react-router-domを導入
```

としましょう。
