ReactのMUIをつかってテンプレート作成

テンプレート

個人用にmarkdown形式のアプリをReactを使って作っています。

少しずつアプリを作っていましたが、見た目が気になって先に進まなくなってしまいました。

大枠だけでも見た目を整えたいと思い、今回はテンプレートを作ってみたいと思います。

実行環境はこれまで作成したDocker環境を使います。

前回までの内容については以下を参照してください。

環境構築については、以下のブログを参考にしてください。

Reactの画面遷移に挑戦する

以下の内容で紹介します。

テンプレートイメージ

テンプレートイメージを決めます。

ホーム画面のテンプレートのイメージです。

header
subheader
main

表示画面のテンプレートのイメージです。

header
subheader
navi
main

エディット画面のテンプレートのイメージです。

header
subheader
edit
view

ディレクトリとファイル名

「src」配下に「template」ディレクトリを作成します。

    
project/
   web/
     Dockerfile
      src/
          react-project/
            src/
                   pages/
                  ┃ ┗ HomePage.js
                  ┃ ┗ Page1Page.js
                  ┃ ┗ P1ge2Page.js
                   template/
                   component/
                   App.js
    
  

「template」配下にテンプレートとなるファイルを作成します。

    
project/
   web/
     Dockerfile
      src/
          react-project/
            src/
                   pages/
                  ┃ ┣ HomePage.js
                  ┃ ┣ Page1Page.js
                  ┃ ┗ P1ge2Page.js
                   template/
                  ┃ ┣ HomeTemplate.js
                  ┃ ┣ MarkdownTemplate.js
                  ┃ ┗ EditTemplate.js
                   component/
                   App.js
    
  

「HomeTemplate」、「MarkdownTemplate」、「EditTemplate」の3つのテンプレートファイルを作成します。

コーディング

各ファイルのコーディングします。

HomeTemplate

ホームページのテンプレートです。

アプリバー、サブバー、メインの3つのブロックで構成します。

  1. import {
  2. AppBar,
  3. Box,
  4. createTheme,
  5. ThemeProvider,
  6. Toolbar
  7. } from "@mui/material";
  8. import { Link } from "react-router-dom"
  9. export default function HomeTemplate() {
  10. const darkTheme = createTheme({
  11. palette: {
  12. mode: "dark",
  13. primary: {
  14. main: "#1976d2"
  15. }
  16. }
  17. });
  18. return (
  19. <ThemeProvider theme={darkTheme}>
  20. <Box
  21. sx={{
  22. display: "flex",
  23. flexDirection: "column",
  24. height: "100vh"
  25. }}
  26. >
  27. <AppBar position="relative" sx={{}}>
  28. <Toolbar>
  29. <Link to="/">ホーム</Link>
  30. <Link to="/page1">ページ1</Link>
  31. <Link to="/page2">ページ2</Link>
  32. </Toolbar>
  33. </AppBar>
  34. <Box sx={{}}>
  35. <Toolbar sx={{ backgroundColor: "1976d2" }}>サブヘッダ</Toolbar>
  36. </Box>
  37. <Box component="main" sx={{}}>
  38. メインページ
  39. </Box>
  40. </Box>
  41. </ThemeProvider>
  42. );
  43. }

ThemeProviderタグで全体を囲みます。

全体をBoxタグで囲みます。

headerをAppBar、subheaderをBox、mainをBoxのブロックをつかいます。

headerとsubheaderはToolbarをつかいます。

headerに画面遷移用のリンクを設定します。

MarkdownTemplate

ページ1のテンプレートです。

アプリバー、サブバー、ナビ、メインの3つのブロックで構成します。

  1. import {
  2. AppBar,
  3. Box,
  4. createTheme,
  5. Drawer,
  6. ThemeProvider,
  7. Toolbar
  8. } from "@mui/material";
  9. import ReactMarkdown from "react-markdown";
  10. import remarkGfm from 'remark-gfm';
  11. import axios from 'axios';
  12. import { Link } from "react-router-dom"
  13. import { useState, useEffect } from "react";
  14. export default function MarkDownTemplate() {
  15. const darkTheme = createTheme({
  16. palette: {
  17. mode: "dark",
  18. primary: {
  19. main: "#1976d2"
  20. }
  21. }
  22. });
  23. const [text, setText] = useState("");
  24. useEffect(() => {
  25. axios.get('http://localhost:5000/markdown')
  26. .then(res => {
  27. setText(res.data.body)
  28. })
  29. }, [])
  30. return (
  31. <ThemeProvider theme={darkTheme}>
  32. <Box
  33. sx={{
  34. display: "flex",
  35. flexDirection: "column",
  36. height: "100vh"
  37. }}
  38. >
  39. <AppBar position="relative" sx={{}}>
  40. <Toolbar>
  41. <Link to="/">ホーム</Link>
  42. <Link to="/page1">ページ1</Link>
  43. <Link to="/page2">ページ2</Link>
  44. </Toolbar>
  45. </AppBar>
  46. <Box sx={{}}>
  47. <Toolbar sx={{ backgroundColor: "#1976d2" }}>サブヘッダ</Toolbar>
  48. </Box>
  49. <Drawer></Drawer>
  50. <Box component="main" sx={{}}>
  51. <Box
  52. sx={{
  53. display: "flex",
  54. flexDirection: "row"
  55. }}
  56. >
  57. <ReactMarkdown remarkPlugins={[remarkGfm]} sx={{width: "100%"}}>{text}</ReactMarkdown>
  58. </Box>
  59. </Box>
  60. </Box>
  61. </ThemeProvider>
  62. );
  63. }

ThemeProviderタグで全体を囲みます。

全体をBoxタグで囲みます。

headerをAppBar、subheaderをBox、naviをDrawer、mainをBoxのブロックをつかいます。

headerとsubheader、DrawerはToolbarをつかいます。

headerに画面遷移用のリンクを設定します。

Markdownの表示をするために、ReactMarkdownと、DBから取得する内容を記載します。

EditTemplate

ページ2のテンプレートです。

アプリバー、サブバー、エディット、ビューの4つのブロックで構成します。

  1. import {
  2. AppBar,
  3. Box,
  4. createTheme,
  5. ThemeProvider,
  6. Toolbar
  7. } from "@mui/material";
  8. import { Link } from "react-router-dom"
  9. import { useState, useEffect } from "react";
  10. import ReactMarkdown from "react-markdown";
  11. import remarkGfm from 'remark-gfm';
  12. import axios from 'axios';
  13. export default function EditTemplate() {
  14. const darkTheme = createTheme({
  15. palette: {
  16. mode: "dark",
  17. primary: {
  18. main: "#1976d2"
  19. }
  20. }
  21. });
  22. const [text, setText] = useState("");
  23. const onChangeText = (event) => setText(event.target.value);
  24. useEffect(() => {
  25. axios.get('http://localhost:5000/markdown')
  26. .then(res => {
  27. setText(res.data.body)
  28. })
  29. }, [])
  30. const onClickText = () => {
  31. const markdown = {
  32. body: text
  33. };
  34. axios.post(`http://localhost:5000/markdown`, markdown)
  35. .then(res => {
  36. console.log(res.data);
  37. })
  38. };
  39. return (
  40. <ThemeProvider theme={darkTheme}>
  41. <Box
  42. sx={{
  43. display: "flex",
  44. flexDirection: "column",
  45. height: "100vh"
  46. }}
  47. >
  48. <AppBar position="relative" sx={{}}>
  49. <Toolbar>
  50. <Link to="/">ホーム</Link>
  51. <Link to="/page1">ページ1</Link>
  52. <Link to="/page2">ページ2</Link>
  53. </Toolbar>
  54. </AppBar>
  55. <Box sx={{}}>
  56. <Toolbar sx={{ backgroundColor: "#1976d2" }}>サブヘッダ</Toolbar>
  57. </Box>
  58. <Box component="main" sx={{}}>
  59. <Box
  60. sx={{
  61. display: "flex",
  62. flexDirection: "row"
  63. }}
  64. >
  65. <Box
  66. sx={{
  67. backgroundColor: "#121212",
  68. height: "100vh",
  69. width: "50%",
  70. color: "white"
  71. }}
  72. >
  73. <textarea
  74. value={text}
  75. style={{ width: '50%', height: '300px' }}
  76. onChange={onChangeText}
  77. ></textarea>
  78. <br />
  79. <button onClick={onClickText}>保存</button>
  80. </Box>
  81. <Box sx={{ idth: "50%" }}>
  82. <ReactMarkdown remarkPlugins={[remarkGfm]}>{text}</ReactMarkdown>
  83. </Box>
  84. </Box>
  85. </Box>
  86. </Box>
  87. </ThemeProvider>
  88. );
  89. }

ThemeProviderタグで全体を囲みます。

全体をBoxタグで囲みます。

headerをAppBar、subheaderをBox、mainをBoxのブロックを使いその中に、editとviewのBoxを設定します。

headerとsubheaderはToolbarをつかいます。

headerに画面遷移用のリンクを設定します。

EditはTextAreaを設定します。

Markdownの表示をするために、ReactMarkdownと、DBから取得する内容を記載します。

HomePage

ホームのページでは、HomeTemplateを呼び出します。

  1. import HomeTemplate from "../template/HomeTemplate";
  2. export default function HomePage() {
  3. return (
  4. <HomeTemplate />
  5. );
  6. }

Page1Page

ページ1のページでは、MarkDownTemplateを呼び出します。

  1. import MarkDownTemplate from "../template/MarkdownTemplate";
  2. export default function Page1Page() {
  3. return (
  4. <MarkDownTemplate />
  5. );
  6. }

Page2Page

ページ2のページでは、EditTemplateを呼び出します。

  1. import EditTemplate from "../template/EditTemplate";
  2. export default function Page2Page() {
  3. return (
  4. <EditTemplate />
  5. );
  6. }

App

Appでルーティングを設定します。

  1. import { BrowserRouter, Routes, Route } from "react-router-dom"
  2. import HomePage from "./pages/HomePage";
  3. import Page1Page from "./pages/Page1Page";
  4. import Page2Page from "./pages/Page2Page";
  5. export default function App() {
  6. return (
  7. <BrowserRouter>
  8. <Routes>
  9. <Route path="/" element={<HomePage />} />
  10. <Route path="/page1" element={<Page1Page />} />
  11. <Route path="/page2" element={<Page2Page />} />
  12. </Routes>
  13. </BrowserRouter>
  14. );
  15. }

画面確認

各ファイルのコーディングします。

docker-compose upを使って各コンテナを起動します。

docker-compose.ymlファイルがある場所で以下のコマンドを実行します。

  1. docker-compose up

起動したら以下のURLをブラウザに入力します。

http://localhost:3000

以下ブラウザの表示です。

ホームページ

markdown-homepage

ページ1ページ

markdown-page1

ページ2ページ

markdown-page2

まとめ

react-muiをつかってテンプレート的なものを作成しました。

次回は各コンポーネント(部品)をつくります。

コメント

0 件のコメント:

コメントを投稿

コメントをお待ちしています。