React + material-ui(MUI)でCardコンポーネントを使ってみる

カード

ReactでMarkdownアプリを作っています。今回はトップの画面に表示するMarkdownのメモをカード型にして表示します。

material-ui(MUI)のカード機能について興味のある方はご覧ください。

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

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

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

カード用のコンポーネントについて

カード用のコンポーネントについて確認します。

カード用のコンポーネントの詳細は以下のページをご覧ください。

Basic cardを参考にします。

カード用のリストコンポーネント作成

カード用のリストコンポーネントを作成します。

作成する場所は、「components/uilibs/organisms」の配下です。

ファイル名は、「MarkdownCardList.tsx」とします。

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

ファイルの内容です。

    
import { FC } from "react";

import { Grid } from "@mui/material";

import { MarkdownType } from "../../../types/MarkdownType.type";
import { MarkdownCard } from "../molecules/MarkdownCard";

interface Props {
  markdowns: Array<MarkdownType>;
}

export const MarkdownCardList: FC<Props> = (props) => {

  const { markdowns } = props;

  return (
    <Grid container spacing={2}>
      {markdowns.map((markdown) => { return <MarkdownCard key={markdown.url} markdown={markdown} /> })}
    </Grid>
  );
};
    
  

カードを横に並べて表示します。表示のためにGridを使います。

Gridのコンポーネントの説明は省略します。

Gridタグの中でマークダウンの情報をmapを使って繰り返し処理をします。

ここで、次に作成するマークダウンのカードのコンポーネントを呼び出します。

カード用のコンポーネント作成

カード用のコンポーネントを作成します。

作成する場所は、「components/uilibs/molecules」の配下です。

ファイル名は、「MarkdownCard.tsx」とします。

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

MarkdownCard.tsxファイルの内容です。

    
import { FC } from "react";

import {
  Card,
  Typography,
  Button,
  CardContent,
  CardActions,
  Grid
} from "@mui/material";

import { MarkdownType } from "../../../types/MarkdownType.type";
import { useNavigate } from "react-router-dom";

interface Prpps {
  markdown: MarkdownType;
}

export const MarkdownCard: FC<Prpps> = (props) => {

  const { markdown } = props;

  const navigate = useNavigate();

  const onClickLink = () => { navigate(markdown.url) };

  return (
    <Grid item xs={3}>
      <Card color="secondary" sx={{ minWidth: 275, height: 300, }}>
        <CardContent sx={{ minWidth: 275, height: 150, overflow: "hidden" }} >
          <Typography variant="h5" component="div" sx={{ paddingBottom: "20px" }}>
            {markdown.title}
          </Typography>
          <Typography variant="body1" >
            {markdown.body}
          </Typography>
        </CardContent>
        <CardActions sx={{ padding: "20px 10px"}}>
          <Button size="small" variant="contained" color='secondary' onClick={onClickLink} >もっと見る</Button>
        </CardActions>
      </Card>
    </Grid>
  );
};
    
  

全体をGridのitemを使い囲みます。

Gridのコンポーネントの説明は省略します。

Gridタグの中でCardのコンポーネントを使います。

Cardタグの中をCardContentとCardActionsで囲みます。

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

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

CardContent
CardContent
CardActions

CardContentにmarkdownのタイトルと本文を表示します。

CardActionsにボタンタグを表示します。

ボタンをクリックするとマークダウンのページに遷移するようにコーディングします。

画面確認

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

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

    
docker-compose up
    
  

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

http://localhost:3000

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

markdown-homepage

まとめ

material-ui(MUI)のカード機能に挑戦しました。

本文はMarkdown変換前の状態です。テキストのような表示をする場合は、markdwon->html->textのような変換が必要かもしれません。

コメント

0 件のコメント:

コメントを投稿

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