Markdwonメモアプリ作成(TypeScript)(第ニ回)

データ管理

前回環境を構築しました。

今回からMarkdwonメモアプリのコーディングを行います。トップページを作って全てのマークダウンデータを出力できるようにします。

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

Markdwonメモアプリ作成(TypeScript)(第一回)

今回の手順は以下のとおりです。

ディレクトリ作成

ディレクトリを作成します。

    
project/
  front/
 ┃ ┣ Dockerfile
 ┃ ┗ src/
 ┃   ┗ markdown-app/
 ┃     ┗ src/
  ┃       ┣ components/
  ┃       ┃ ┣ pages/
  ┃       ┃ ┣ templates/
  ┃       ┃ ┣ types
  ┃       ┃ ┗ uilibs/
  ┃       ┃   ┣ organisms/
  ┃       ┃   ┣ molecules/
  ┃       ┃   ┣ atoms/
  ┃       ┃   ┗ theme/
 ┃       ┗ setupTests.ts
・・・略・・・
    
  

src配下にcomponentsのフォルダを作成します。

componentsのフォルダ配下にpages、templates、uilibs、typesを配置します。

uilibsフォルダ配下には、organisms、molecules、atoms、themeフォルダを配置します。

今回はふたつのページ用意します。

  • トップページ
  • マークダウンページ

App.tsx更新

App.tsxファイルを更新します。

トップページとマークダウンページを切り替えます。

  1. import { FC } from "react";
  2. import { BrowserRouter, Route, Routes } from "react-router-dom";
  3. import { Markdown } from "./components/pages/Markdown";
  4. import { Top } from "./components/pages/Top";
  5. export const App: FC = () => {
  6. return (
  7. <BrowserRouter>
  8. <Routes>
  9. <Route path="/" element={<Top />} />
  10. <Route path="*" element={<Markdown />} />
  11. </Routes>
  12. </BrowserRouter>
  13. );
  14. };

URLとページの関係は以下の通りです。

/ トップページ Top.tsx
* マークダウンページ Markdown.tsx

トップページの作成

トップページ(Top.tsx)を作成します。

「pages/」配下にTop.tsxファイルを配置します。

    
project/
  front/
 ┃ ┣ Dockerfile
 ┃ ┗ src/
 ┃   ┗ markdown-app/
 ┃     ┗ src/
  ┃       ┣ components/
  ┃       ┃ ┣ pages/
  ┃       ┃ ┃ ┣ Top.tsx
  ┃       ┃ ┃ ┗ Markdown.tsx
  ┃       ┃ ┣ templates/
・・・略・・・
    
  

ページの内容は以下の通りです。

  1. import { FC, useEffect, useState } from "react";
  2. import axios from "axios";
  3. import { MarkdownType } from "../../types/MarkdownType.type";
  4. import { TopTemplate } from "../templates/TopTemplate";
  5. export const Top: FC = () => {
  6. const [markdowns, setMarkdowns] = useState<Array<MarkdownType>>([]);
  7. useEffect(() => {
  8. axios.get<Array<MarkdownType>>("http://localhost:5000/markdown")
  9. .then(res => { setMarkdowns(res.data) })
  10. }, []);
  11. return (
  12. <TopTemplate markdowns={markdowns} />
  13. );
  14. };

このページは、トップページのテンプレート(TopTemplate)のコンポーネントを呼び出します。

APIの取得はこのコンポーネントで行います。

APIから取得するデータはMarkdownTypeとして定義します。

MarkdownType作成

MarkdownType.type.tsファイルを作成します。

    
project/
  front/
 ┃ ┣ Dockerfile
 ┃ ┗ src/
 ┃   ┗ markdown-app/
 ┃     ┗ src/
  ┃       ┣ components/
  ┃       ┣ theme/
  ┃       ┃ ┗ MarkdownType.type.ts
・・・略・・・
    
  

ページの内容は以下の通りです。

  1. export type MarkdownType = {
  2. url: string
  3. title: string
  4. body: string;
  5. };

Markdownテーブルのカラムと同じ構成です。

マークダウンページの作成

マークダウンのページ(Markdown.tsx)を作成します。

「pages/」配下にMarkdown.tsxファイルを配置します。

    
project/
  front/
 ┃ ┣ Dockerfile
 ┃ ┗ src/
 ┃   ┗ markdown-app/
 ┃     ┗ src/
  ┃       ┣ components/
  ┃       ┃ ┣ pages/
  ┃       ┃ ┃ ┣ Top.tsx
  ┃       ┃ ┃ ┗ Markdown.tsx
  ┃       ┃ ┣ templates/
・・・略・・・
    
  

ページの内容は以下の通りです。

  1. import { FC } from "react";
  2. export const Markdown: FC = () => {
  3. return (
  4. <h1>マークダウンページ</h1>
  5. )
  6. }

今回はコーディングを省略します。H1タグでマークダウンページと表示します。

トップテンプレートの作成

トップテンプレート(TopTemplate.tsx)ファイルを作成します。

「templates/」配下に配置します。

    
project/
  front/
 ┃ ┣ Dockerfile
 ┃ ┗ src/
 ┃   ┗ markdown-app/
 ┃     ┗ src/
  ┃       ┣ components/
  ┃       ┃ ┗  templates/
  ┃       ┃    ┗ TopTemplates.tsx
・・・略・・・
    
  

トップテンプレートは、ヘッダとメインのコンテンツを構成します。

ヘッダ
メイン

ページの内容は以下の通りです。

  1. import { FC, useEffect, useState } from "react"
  2. import { Link } from "react-router-dom";
  3. import { Container, ThemeProvider } from "@mui/material";
  4. import { Box } from "@mui/system";
  5. import { MarkdownType } from "../../types/MarkdownType.type"
  6. import { HeaderNavigation } from "../uilibs/organisms/HeaderNavigation";
  7. import { Theme } from "../uilibs/theme/Theme";
  8. interface MarkdownProps {
  9. markdowns: Array<MarkdownType>
  10. };
  11. export const TopTemplate: FC<MarkdownProps> = (props) => {
  12. const { markdowns } = props;
  13. const theme = Theme;
  14. const styleContainer = { display: "flex", flexDirection: "column" };
  15. return (
  16. <ThemeProvider theme={theme}>
  17. <Box component="main" >
  18. <HeaderNavigation />
  19. <Container maxWidth="xl" sx={styleContainer}>
  20. {markdowns.map((markdown) => { return <Link to={markdown.url} key={markdown.url}>{markdown.title}</Link> })}
  21. </Container>
  22. </Box>
  23. </ThemeProvider>
  24. )
  25. }

MUIのテーマをつくります。Themeクラスを呼び出します。

HeaderNavigationのコンポーネントを呼び出します。

Topページからの値を受け取ってmapでひとつづつタイトルを出力します。

テーマの作成

Theme.tsファイルを作成します。

    
project/
  front/
 ┃ ┣ Dockerfile
 ┃ ┗ src/
 ┃   ┗ markdown-app/
 ┃     ┗ src/
  ┃       ┣ components/
  ┃       ┃ ┗ uilibs/
  ┃       ┃   ┗ theme/
  ┃       ┃     ┗ Theme.ts
  
・・・略・・・
    
  

ページの内容は以下の通りです。

  1. import { createTheme } from "@mui/material/styles";
  2. export const Theme = createTheme({
  3. palette: {
  4. mode: "dark",
  5. primary: {
  6. main: "#1976d2"
  7. }
  8. }
  9. });

ヘッダーナビゲーション部品の作成

ヘッダーナビゲーション部品(HeaderNavigation.tsx)ファイルを作成します。

「organisms/」ディレクトリ配下に配置します。

    
project/
  front/
 ┃ ┣ Dockerfile
 ┃ ┗ src/
 ┃   ┗ markdown-app/
 ┃     ┗ src/
  ┃       ┣ components/
  ┃       ┃ ┗ uilibs/
  ┃       ┃   ┗ organisms/
  ┃       ┃     ┗ HeaderNavigation.tsx

・・・略・・・
    
  

ページの内容は以下の通りです。

  1. import { FC } from "react";
  2. import {
  3. AppBar,
  4. Toolbar,
  5. Typography
  6. } from "@mui/material";
  7. import { HomeNavigation } from "../molecules/HomeNavi";
  8. export const HeaderNavigation: FC = () => {
  9. const StyleToolBar = {
  10. display: "flex", justifyContent: "space-between"
  11. }
  12. return (
  13. <AppBar position="relative">
  14. <Toolbar sx={StyleToolBar}>
  15. <Typography>markdown</Typography>
  16. <HomeNavigation />
  17. </Toolbar>
  18. </AppBar>
  19. );
  20. };

MUIのTypographyで「markdown」と表示します。

ホームアイコン(HomeNavigation)を呼び出します。

ホームアイコンの作成

ホームアイコンを作成します。

「molecules/」ディレクトリ配下に(HomeNavi.tsx)を配置します。

    
project/
  front/
 ┃ ┣ Dockerfile
 ┃ ┗ src/
 ┃   ┗ markdown-app/
 ┃     ┗ src/
  ┃       ┣ components/
  ┃       ┃ ┗ uilibs/
  ┃       ┃   ┗ molecules/
  ┃       ┃     ┗ HomeNavi.tsx
・・・略・・・
    
  

ページの内容は以下の通りです。

  1. import { useNavigate } from "react-router-dom";
  2. import { FC } from "react";
  3. import {
  4. BottomNavigation,
  5. BottomNavigationAction,
  6. } from "@mui/material";
  7. import HomeIcon from '@mui/icons-material/Home';
  8. export const HomeNavigation: FC = () => {
  9. const navigate = useNavigate();
  10. const onClickHome = () => { navigate('/') };
  11. return (
  12. <BottomNavigation showLabels>
  13. <BottomNavigationAction label="ホーム" icon={<HomeIcon />} onClick={onClickHome} />
  14. </BottomNavigation>
  15. );
  16. };

画面確認

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

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

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

  1. docker-compose up

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

http://localhost:3000

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

トップページ

markdown-homepage

まとめ

今回からMarkdownのアプリを作成します。今回はトップページを作成しました。

次回はマークダウンページを作成します。

コメント

0 件のコメント:

コメントを投稿

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