こんにちは、MSKです。
Reactでカード表示をやってみたので、その解説を行います。
スポンサーリンク
準備
まずはReactアプリを準備します。
typescriptを使っていきます。
npm create-react-app react-app --template typescript
使うのはmaterial-uiなのでインストールします。
npm install @material-ui/core
コーディング
表示するカードをコンポーネントにしたいと思います。
表示する内容はprops経由で送るとします。
まずはtypescriptを使っているので、propsの型を定義します。
型をまとめるtypes.tsxというファイルを作ります。
その中に、
export interface CARD_INFO{
img_path: string,
title: string,
message:string,
url:string,
height:number,
width: number,
}
としています。
カード表示にはmaterial-uiのCardを使用しています。
カードをクリックすると指定したURLに飛ばしたかったので、CardActinoAreaを使っています。
表示内容は画像とタイトル、簡単な紹介としたいと思います。
画像の表示にCardMedia、タイトルや紹介にはCardContentを使っています。
CardComp.tsxというファイルを作成して次のようにしました。
import React from 'react'
import Card from '@material-ui/core/Card';
import CardMedia from '@material-ui/core/CardMedia';
import CardContent from '@material-ui/core/CardContent';
import Typography from '@material-ui/core/Typography';
import {Button,CardActionArea,CardActions} from '@material-ui/core';
import {CARD_INFO} from '../types';
const CardComp = (props:CARD_INFO) => {
const style = {
height: props.height,
width: props.width,
maxWidth:320
};
const img_height = props.height*0.6;
return (
<div className="product-card-top">
<Card style={style}>
<CardActionArea href={props.url}>
<CardMedia image={props.img_path} title={props.title} style={{width:props.width,height:img_height}}/>
<CardContent>
<Typography variant="h5" component="div">
{props.title}
</Typography>
<Typography variant="body2" color="textSecondary">
{props.message}
</Typography>
</CardContent>
</CardActionArea>
</Card>
</div>
)
}
export default CardComp
CardCompを使うコンポーネントでは、Gridを使って表示しています。
(sassを使って、少し表示を整えてもいます。)
import React from 'react';
import {Grid} from '@material-ui/core';
import Footer from '../Footer/Footer';
import CardComp from '../CardComp/CardComp';
import PORTFOLIO_SITE_IMG from '../../assets/images/portfolio_site.png';
import SIMPLE_PDF_VIEWER_IMG from '../../assets/images/simple_pdf_viewer.png';
import SAMPLE_WEBPAGE1_IMG from '../../assets/images/sample-webpage1.png';
import './Create.scss';
const Create:React.FC = () => {
return (
<div className="create-page">
<p className="create-top">Create</p>
<p className="create-intro">作ったものの一覧です。少しづつ更新しています。</p>
<Grid container className="create-container" justify="center">
<Grid item container xs={12} md={4} sm={6} spacing={1} className="create-grid-item" justify="center">
<CardComp
title={"ポートフォリオサイト"}
message={"Reactで作成。制作物や僕自身について紹介しています。少しづつ更新中。"}
img_path={PORTFOLIO_SITE_IMG}
url="https://github.com/MSK0303/portfolio"
height={300}
width={310} />
</Grid>
<Grid item container xs={12} md={4} sm={6} spacing={1} className="create-grid-item" justify="center">
<CardComp
title={"simple-pdf-viewer"}
message={"Electronで作成。シンプルなPDFビュワー。自分が欲しい機能があれば更新しています。"}
img_path={SIMPLE_PDF_VIEWER_IMG}
url="https://github.com/MSK0303/simple-pdf-viewer"
height={300}
width={320} />
</Grid>
<Grid item container xs={12} md={4} sm={6} spacing={1} className="create-grid-item" justify="center">
<CardComp
title={"Webサイト1"}
message={"HTML・CSS(SASS)・Javascriptで作成。デザインはクリスタ(https://crestadesign.org/)から使わせてもらいました。"}
img_path={SAMPLE_WEBPAGE1_IMG}
url="https://mcgex.net/webpage-sample1/public/index.html"
height={300}
width={320} />
</Grid>
</Grid>
<Footer />
</div>
)
}
export default Create;
表示としては次のようになります。


最後に
Reactでカード表示を行ってみました。
material-uiを使ってコンポーネント化してみると表示したい内容が増えたときに楽ですね。
以上、「Reactでカード表示をやってみた!」でした。
最後までご覧いただき、ありがとうございます。
スポンサーリンク
