React×MUIを使ったUI実装の基本と活用ポイント

はじめに

Reactはコンポーネント指向のJavaScriptライブラリで、動的なWebアプリケーションを構築しやすい特徴があります。 一方、 Material UI (MUI) はGoogleのMaterial DesignをベースにしたUIコンポーネントライブラリで、Reactと組み合わせることで一貫したデザインと機能性を両立できます。

これからプログラミングを始める皆さんの中には、見た目の実装に苦手意識を持つ方もいるかもしれません。 しかし、あらかじめ用意されたコンポーネントを使えば、レイアウトに関する手間を減らすことができます。 今回は初心者の方でも理解しやすいように、ReactとMUIを組み合わせたUI開発の流れを解説していきましょう。

ReactとMaterial UIの概要

Reactの基本

Reactは仮想DOMという仕組みを利用し、状態に応じて効率的に画面を再描画することができます。 また、コンポーネントという単位でUIを分割していくため、複雑なアプリケーションでもパーツごとに管理しやすい構造になっています。

さらにReactは、公式ツールチェーンやサードパーティ製のライブラリが充実している点が魅力でしょう。 ルーティングやグローバル状態の管理など、さまざまな機能を簡単に拡張できます。 ただし、見た目の部分はReact自体に組み込まれていないので、UIの仕上がりに悩むことがあるかもしれません。

Material UI(MUI)の位置づけ

MUIは、Googleが提唱するMaterial Designのガイドラインに準拠したコンポーネント集です。 ボタンやナビゲーションバー、フォーム部品など、Webアプリケーションでよく使われるパーツがあらかじめ用意されています。 これによって、プロジェクトのUIを1から作る必要がなく、統一感のあるデザインを短時間で導入できます。

また、Reactのコンポーネントを拡張する形で提供されているため、JSXでの記述と相性が良いのも特徴です。 カスタマイズ性も高く、テーマを変更すればブランドに合った色やタイポグラフィを簡単に適用できるでしょう。

セットアップとインストール

必要な環境の準備

ReactとMUIを使うためには、まずNode.jsとnpmまたはYarnといったパッケージマネージャーが必要です。 これらが未インストールの場合は、公式サイトからダウンロードしてインストールしておきましょう。

Node.jsを導入後は、開発用フォルダを作成して「npm init」または「yarn init」を実行します。 これでpackage.jsonが生成され、外部のライブラリを管理しやすくなります。 あとはReactとMUIのパッケージを追加するだけで、基本的な環境のセットアップは完了です。

ReactとMUIを導入する手順

Reactのパッケージとしては「react」と「react-dom」が代表的です。 さらにMUIはコア部分である「@mui/material」とアイコンセットの「@mui/icons-material」などを使うことが多いでしょう。

具体的には、以下のコマンドを実行してパッケージを追加します。

npm install react react-dom @mui/material @mui/icons-material

インストールが完了したら、JSXを書くためのビルド環境が必要です。 WebpackやViteなど、好きなツールを選んで環境を整えておくと開発しやすくなります。

基本的なコンポーネントの使い方

代表的なMUIコンポーネント一覧

MUIには多種多様なコンポーネントが揃っていますが、最初はよく使われる基本的なパーツを把握しておくと便利です。 たとえば以下のようなコンポーネントがあります。

コンポーネント特徴一言メモ
Buttonクリック可能なボタンを作れるアクション向け
TextFieldテキスト入力欄を作れるフォーム入力
Cardまとまった情報をカード形式で表示できるビジュアル要素
AppBarページ最上部に配置されるナビゲーション固定ヘッダー
Drawerサイドメニューの実装に使われるナビゲーション

これらは一部に過ぎませんが、Webアプリケーションでよく利用されるものが一通り揃っています。 はじめはButtonやTextFieldなど基本的なものから触り、慣れてきたらCardやDrawerといったナビゲーション関連にも挑戦してみると良いでしょう。

Buttonコンポーネントの例

MUIで用意されたButtonを使うと、標準でMaterial Designに沿った押しやすいボタンが作れます。 使い方はシンプルで、Reactのコンポーネントとしてインポートするだけです。

import React from "react";
import Button from "@mui/material/Button";

function ExampleButton() {
  return (
    <Button variant="contained" color="primary">
      ボタンをクリック
    </Button>
  );
}

export default ExampleButton;

このように、variantcolor といったプロップスを切り替えるだけで、見た目を簡単に変更できます。 実装がシンプルなので、初心者の方でも使いやすいでしょう。

TextFieldコンポーネントの例

フォーム入力欄の基本となるテキストボックスも、MUIではTextFieldコンポーネントを利用して作ります。 次のように記述できます。

import React, { useState } from "react";
import TextField from "@mui/material/TextField";

function ExampleForm() {
  const [value, setValue] = useState("");

  const handleChange = (event) => {
    setValue(event.target.value);
  };

  return (
    <TextField
      label="名前"
      value={value}
      onChange={handleChange}
      variant="outlined"
      fullWidth
      margin="normal"
    />
  );
}

export default ExampleForm;

ここでは、useStateでテキストの値を管理しています。 onChangeイベントで入力内容をセットすることで、リアルタイムに状態を更新できます。 初心者でも理解しやすい構造なので、まずはこうした基本パターンから学んでみるのがおすすめです。

レイアウトとテーマカスタマイズ

レイアウトの基本構造

アプリの見た目を整えるうえで大切なのがレイアウトです。 MUIにはグリッドレイアウトを簡単に実装できるGridコンポーネントが用意されています。 例えば、左右に並べたい場合や、モバイル対応でカラム数を変えたい場合などに役立ちます。

import React from "react";
import { Grid, Paper } from "@mui/material";

function LayoutExample() {
  return (
    <Grid container spacing={2}>
      <Grid item xs={12} sm={6}>
        <Paper>左側のコンテンツ</Paper>
      </Grid>
      <Grid item xs={12} sm={6}>
        <Paper>右側のコンテンツ</Paper>
      </Grid>
    </Grid>
  );
}

export default LayoutExample;

xssmといったプロップスを指定するだけで、画面サイズに応じたカラムの幅を簡単に制御できます。 また、Paperでコンテンツをくるむことで、Material Design風の背景を得ることも可能です。

テーマのカスタマイズ

デフォルトのまま使うと、Material Designの標準的な色やフォントが適用されます。 しかし、プロジェクトによってはブランドカラーや独自のデザインを反映させたいことがありますよね。

その場合、MUIのThemeProvidercreateThemeを使ってテーマを上書きできます。 以下の例では、プライマリーカラーをカスタマイズして独自のテーマを適用しています。

import React from "react";
import { createTheme, ThemeProvider } from "@mui/material/styles";
import Button from "@mui/material/Button";

const customTheme = createTheme({
  palette: {
    primary: {
      main: "#008080",
    },
  },
});

function ThemedApp() {
  return (
    <ThemeProvider theme={customTheme}>
      <Button variant="contained" color="primary">
        カスタムカラーのボタン
      </Button>
    </ThemeProvider>
  );
}

export default ThemedApp;

palettetypographyなど、多岐にわたる項目を上書きできるのがメリットです。 テーマを使いこなせば、パーツごとにカスタムCSSを書かなくても全体のデザインを統一しやすいでしょう。

MUIでは公式ドキュメントに豊富なテーマ設定のサンプルが用意されています。 細かい部分まで柔軟に変更できるので、アプリ全体のデザインポリシーに合わせやすいのがポイントです。

実務での活用例

フォーム画面の実装

多くのWebアプリケーションでは、ユーザー情報の登録画面など、フォーム機能を実装する場面があるのではないでしょうか。 MUIなら、テキスト入力欄(TextField)、選択リスト(Select)、チェックボックス(Checkbox)などが用意されているため、統一感のあるフォームを作成できます。

フォーム全体をBoxGridでレイアウトし、必要なフォームコントロールを並べるだけで見た目が整うのが利点です。 React Hook Formなどのライブラリと組み合わせれば、バリデーションもスムーズに実装しやすいです。

管理画面やダッシュボード

管理画面やダッシュボードのような場面でも、MUIは便利に活用できます。 DrawerAppBarでメインメニューとヘッダーを固定し、中身をグリッドレイアウトで配置すれば、素早く管理画面の基礎が作れます。

また、Tableコンポーネントを使用すれば、データを表形式で見やすく表示可能です。 ページネーションやフィルタリング機能も、MUIの拡張コンポーネントを活用すると効率よく実装できます。

よくある疑問

独自のスタイリングとの両立は可能?

MUIはコンポーネントがすでに装飾された状態で提供されますが、styled APIやSXプロップスを利用すれば、柔軟にスタイリングを追加できます。 プロジェクト独自のスタイルガイドがある場合でも、テーマやSXプロップスで細部を上書きしながら、基本的な操作性やレイアウトを保つことができます。

また、CSS-in-JSだけでなく、CSSモジュールなど他のアプローチとも共存が可能です。 全てをMUIに合わせる必要はないので、部分的に利用しても問題ありません。

アイコンの利用は難しくない?

ボタンやメニューなどにアイコンを配置したい場合は、@mui/icons-materialを使ってアイコンを手軽に導入できます。 Reactコンポーネントとしてアイコンが提供されているので、サイズや色を簡単に変更可能です。

使用例としては、以下のようにアイコンをインポートし、Buttonコンポーネントの先頭や末尾に配置します。

import React from "react";
import Button from "@mui/material/Button";
import SendIcon from "@mui/icons-material/Send";

function IconButtonExample() {
  return (
    <Button variant="contained" color="primary" startIcon={<SendIcon />}>
      送信
    </Button>
  );
}

export default IconButtonExample;

これでテキストとアイコンが並んだボタンを実装できます。 見やすさや操作性を向上させるために、アイコンの利用はとても役に立つでしょう。

アイコンを適切に使うことで、ユーザーが直感的に操作しやすいインターフェースを実現しやすくなります。

まとめ

ReactとMUIを組み合わせることで、デザインと機能の両立がしやすくなると感じる方は多いでしょう。 UI開発が苦手な初学者の皆さんでも、パーツを組み合わせる形でスムーズに画面を構築できます。

デフォルトのコンポーネントに加え、テーマやスタイリングの仕組みを使いこなすと、独自の色使いやレイアウトも取り入れやすくなります。 自分のアプリに最適な形でMUIをカスタマイズしながら、Reactのコンポーネント構造を習得していくと良いでしょう。 これから実際に手を動かし、ぜひ体験を積んでみてください。

Reactをマスターしよう

この記事で学んだReactの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。