でじぼうです。
Reactでアプリを作っていると「もっと見た目を整えたい」「CSSがむずかしい」と感じたこと、ありませんか?そんなときに活躍するのが、MUI というライブラリです!

でじぼう
この記事は下記の方がおすすめ!
- MUIとは何か?
- おしゃれなボタンやフォームをすぐ使いたい
- ReactでUIを作っているけど、CSSが苦手
Instagramフォロワー数9,500人を越える人気のもち・大福店 えにかいたもち
MUIとは?
MUIとはReact専用のUIライブラリです。
かんたんに言うと、Reactで使える「見た目が整ったパーツ(部品)」を集めたツール集です。
例
- ボタン
- 入力欄
- ダイアログ(ポップアップ)
- ナビゲーションバー
などが、すでに整った見た目で提供されており、自分でCSSを書かなくてもキレイな画面が作れるのが特徴です。
MUIのインストール方法
MUIを利用するためには、UIコンポーネントライブラリをインストールしなければいけません。
以下のコマンドを実行します。
npm install @mui/material @emotion/react @emotion/styled@mui/material:見た目の部品である、UIコンポーネントを提供するライブラリ
@emotion/react:部品にスタイルを反映させるライブラリ
@emotion/styled:自分で部品のスタイルを定義するライブラリ
実際のコード
下記の、統一感のあるフォームデザインを自分でCSSで整えるのは、意外と手間がかかります。
その点、MUIを使えばスタイルがあらかじめ用意されているため、見た目の整ったフォームを素早く実装することができます。

送信ボタンを押下するとモーダル表示される

import {
  AppBar,             // 画面上部に固定されるヘッダー
  Toolbar,            // ヘッダーの中の横並びレイアウト用
  Typography,         // 見出しや本文などのテキスト表示
  Container,          // 中央寄せ&余白ありの全体レイアウト枠
  TextField,          // 入力フォーム(名前・メールなど)
  Button,             // 押せるボタン(送信・閉じるなど)
  Grid,               // 要素を縦や横に並べるレイアウト
  Card,               // 情報を囲って見せるパネル(カード)
  CardContent,        // カード内に配置する中身
  Box,                // スタイル調整や余白をつけるための箱
  Paper,              // 白背景+影のついたパネル
  Dialog,             // ポップアップウィンドウ(モーダル)
  DialogTitle,        // モーダルのタイトル部分
  DialogContent,      // モーダルの本文部分
  DialogActions       // モーダルのボタン部分(閉じるなど)
} from "@mui/material";
import { useState } from "react";
function ContactForm() {
  const [open, setOpen] = useState(false);
  return (
    <>
      {/* AppBar:上部ナビゲーション */}
      <AppBar position="static">
        <Toolbar>
          <Typography variant="h6">ABC会社 - お問い合わせ</Typography>
        </Toolbar>
      </AppBar>
      {/* Container:中央レイアウト */}
      <Container maxWidth="sm" sx={{ mt: 4 }}>
        {/* Box:フォーム全体の囲み */}
        <Box component={Paper} elevation={3} p={4}>
          <Typography variant="h5" gutterBottom>
            お問い合わせフォーム
          </Typography>
          {/* Grid:縦並びレイアウト */}
          <Grid container spacing={2} direction="column">
            {/* 名前入力 */}
            <Grid item>
              <TextField label="お名前" fullWidth variant="outlined" />
            </Grid>
            {/* メールアドレス入力 */}
            <Grid item>
              <TextField label="メールアドレス" fullWidth variant="outlined" />
            </Grid>
            {/* 件名 */}
            <Grid item>
              <TextField label="件名" fullWidth variant="outlined" />
            </Grid>
            {/* 内容 */}
            <Grid item>
              <TextField
                label="お問い合わせ内容"
                fullWidth
                multiline
                rows={4}
                variant="outlined"
              />
            </Grid>
            {/* 送信ボタン */}
            <Grid item>
              <Button
                variant="contained"
                color="primary"
                fullWidth
                onClick={() => setOpen(true)}
              >
                送信する
              </Button>
            </Grid>
          </Grid>
        </Box>
        {/* Card:会社案内パネル */}
        <Box mt={4}>
          <Card>
            <CardContent>
              <Typography variant="h6">ABC会社について</Typography>
              <Typography variant="body2" color="text.secondary">
                〒100-0001 東京都中央区サンプル1-2-3 営業時間:平日 9:00〜18:00
                電話:03-1234-5678
              </Typography>
            </CardContent>
          </Card>
        </Box>
      </Container>
      {/* Dialog:送信後モーダル */}
      <Dialog open={open} onClose={() => setOpen(false)}>
        <DialogTitle>送信完了</DialogTitle>
        <DialogContent>
          <Typography>
            お問い合わせありがとうございました。ABC会社より折り返しご連絡いたします。
          </Typography>
        </DialogContent>
        <DialogActions>
          <Button onClick={() => setOpen(false)} autoFocus>
            閉じる
          </Button>
        </DialogActions>
      </Dialog>
    </>
  );
}
export default ContactForm;こんなときにMUIはおすすめ!
- デザインの統一感がほしいとき
- 手早く開発を進めたいとき
- チーム開発で見た目を揃えたいとき
- バリデーション付きのフォームなど、複雑なUIを早く実装したいとき
注意点・デメリット
- クラス名で直接装飾しにくく、カスタマイズが難しいと感じることがある
- 内部でEmotion(CSS-in-JS)を使っているため、CSSの書き方が普通と少し違う
◆ 普通のCSSの書き方
/* style.css */
.button {
  background-color: red;
}◆ Emotion(CSS-in-JS)を使った書き方(MUIの場合)
import { styled } from '@mui/material/styles';
const CustomButton = styled('button')({
  backgroundColor: 'red',
});

 
  




コメント