2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Next.js】管理画面を作りながらNext.jsを学ぶ(ChakraUI/ルーティング)

Last updated at Posted at 2022-03-10

まえがき

前記事にて、管理画面をcreate-react-appで作成した。これをNext.jsで作ってみる。

プロジェクト作成

yarn create next-app --typescript

プロジェクト名を聞かれるので「next-practice」と入力

C:\Users\daisu\Desktop\workspace>yarn create next-app --typescript
yarn create v1.22.5
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
success Installed "create-next-app@12.1.0" with binaries:
      - create-next-app
√ What is your project named? ... next-practice
Creating a new Next.js app in C:\Users\daisu\Desktop\workspace\next-practice.

起動

yarn dev

http://localhost:3000 にアクセス
image.png

プロジェクト構成

素のReactプロジェクト
・src/index.tsxが起点となり、ルートコンポーネントのsrc/App.tsxをレンダリングする

に対して、

Next.jsプロジェクト
起点のスクリプトファイルが存在しない
pages配下のファイルがそのままルーティング設定となる。
  - pages/index.tsx → 「/」でアクセス
  - pages/abount.tsx → 「/about」でアクセス
  - pages/account.tsx → 「/account」でアクセス
  - pages/dashboard/index.tsx → 「/dashboard」でアクセス

pages配下のファイル作成時のポイント

・NextPage型のオブジェクトを戻りとする関数をexportすること

import type { NextPage } from 'next'

const Home: NextPage = () => {
  return (
    <div>
       // 省略
    </div>
  )
}

export default Home

管理画面を作ってみる

・基本的には前記事で作成した素のReactプロジェクト内の各ファイルを、そのままNext.jsプロジェクトに移行する。
・完成形の画面
image.png

必要なコンポーネントを並べるとこんな感じ

 pages/
 ・index.tsx(TOP画面)
 ・account.tsx(Account管理画面)
 ・charts.tsx(Charts管理画面)
 ・dashboard.tsx(Dashboard管理画面)
 ・mailBox.tsx(MailBox管理画面)
 ・message.tsx(Message管理画面)
 ・rateReview.tsx(RateReview管理画面)
 ・weather.tsx(Weather管理画面)

 components/
 ・TopHeader.tsx(ヘッダー)
 ・SideMenu.tsx(サイドメニュー)
 ・account/AccountTable.tsx(Accountテーブル)

 public/
 ・sampleLogo.PNG(ヘッダ画像)
 ・data/accounts.json(Account一覧取得APIの戻り値用)

また、Next.jsでChakraUIを使うために必要なライブラリをインストールしておく。

yarn add -D @chakra-ui/react @emotion/react@^11 @emotion/styled@^11 framer-motion@^4

Next.jsでのルーティング設定

素のReactプロジェクトではreact-rooterを利用してルーティング設定をルートコンポーネントに定義した。

import { BrowserRouter, Routes, Route } from "react-router-dom";

export const App = () => {
  return (
    <ChakraProvider theme={theme}>
      <Flex w="100vw" h="100wh">
        <TopHeader />
        <Box mt="100px">
          <Flex>
            <BrowserRouter>
              <SideMenu />
              <Box w="70vw">
                <Routes> // 画面ごとにルーティング設定
                  <Route path="/" element={<Dashboard />} />
                  <Route path="/account" element={<Account />} />
                  <!-- 以下省略 -->
                </Routes>
              </Box>
            </BrowserRouter>
          </Flex>
        </Box>
      </Flex>
    </ChakraProvider>
  );
};

Next.jsプロジェクトでは、先述した通り「pagesディレクトリに配置したファイルがそのままルーティング設定」となる。

Next.jsでのレイアウト設定

レイアウトのような、どの画面でも表示したいものはpages/_app.tsxに定義する。

import '../styles/globals.css'
import type { AppProps } from 'next/app'

function MyApp({ Component, pageProps }: AppProps) {
  return <Component {...pageProps} />
}

export default MyApp

今回追加すべきものとしては「レイアウト用コンポーネント」と「ChakraProvider」があるので、↓のようになる。

import type { AppProps } from 'next/app'
import { ChakraProvider, Box, Flex, theme } from "@chakra-ui/react";
import { TopHeader } from '../components/TopHeader';
import { SideMenu } from '../components/SideMenu';

function MyApp({ Component, pageProps }: AppProps) {
  return (
    <ChakraProvider theme={theme}>
      <Flex w="100vw" h="100wh">
        <TopHeader />
        <Box mt="100px">
          <Flex>
            <SideMenu />
              <Box w="70vw">
                <Component {...pageProps} />
              </Box>
          </Flex>
        </Box>
      </Flex>
    </ChakraProvider>
  );
}

export default MyApp

アイコンクリック時に画面遷移するようにする

素のReactプロジェクトではreact-router-domのuseNavigate関数を用いていた。

<script lang="ts">
  import { useNavigate } from "react-router-dom";
</script>

<Button variant="ghost" onClick={() => navigate(item.path)}>
  <Icon as={item.icon} w={7} h={7} mr="13px" />
  {item.name}
</Button>

Next.jsプロジェクトではnext/routerを利用する。

import { useRouter } from 'next/router'

export const SideMenu = () => {
  // useRouter関数でrouterオブジェクト取得
  const router = useRouter();
  const sideMenuItems = [//省略];
  return (
    <Box w="20vw" m="20px">
      {sideMenuItems.map((item) => (
        <label>
          <Box mt="10px" ml="10px">
            // router.push()で画面遷移
            <Button variant="ghost" onClick={() => router.push(item.path)}>
              <Icon as={item.icon} w={7} h={7} mr="13px" />
              {item.name}
            </Button>
          </Box>
        </label>
      ))}
    </Box>
  );
};

まとめ(素のReactとNext.jsの違い)

違いをあげれば他にも沢山挙げられると思うが、本記事では以下の3つを違いとして取り上げる。

ルーティング設定

素のReact
 ・"react-router-dom"を使う。
 ・BrowserRouter,Routes,Routeで画面ごとにルーティング設定する必要がある。
Next.js
 ・pagesディレクトリ配下のファイルが、自動でルーティング設定に落とし込まれる。

レイアウト設定

素のReact
 ・src/App.tsxにてレイアウト設定
Next.js
 ・pages/_app.tsxにてレイアウト設定

クリックによる画面遷移

素のReact
 ・react-router-domのuseNavigate関数を使う。
Next.js
 ・next/routerのuseRouter関数を使う。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?