強力なUIコンポーネントライブラリ「MUI(Material-UI)」について《トラブルシューティング編》

よくある質問とトラブルシューティング

MUI(Material-UI)を使用していると、初心者でも経験者でも共通して直面しやすいエラーや問題がいくつか存在します。この章では、よく発生するエラーとその解決方法、ドキュメントでは見つけにくい設定のヒント、さらにはコミュニティリソースやサポートについて詳しく解説します。

Material-UIと@mui/materialのバージョン不整合

Module not found: Can't resolve '@material-ui/core/Button'

MUIはv5で大幅な変更が加えられ、以前の@material-ui/coreから@mui/materialにパッケージが変更されました。このため、v4のコードをそのまま使うと、エラーが発生します。解決するには、@mui/materialに関連するすべての依存関係を最新のバージョンに更新し、インポートパスを修正します。

npm install @mui/material @emotion/react @emotion/styled

インポートを以下のように修正します。

import { Button } from '@mui/material';  // 正しいインポート方法

カスタムテーマが適用されない

カスタムテーマを設定したのに、意図したスタイルが反映されない場合があります。これは、ThemeProviderが正しく使用されていない、もしくはCssBaselineが設定されていないことが原因です。

カスタムテーマを使用する際には、必ずThemeProviderをルートコンポーネントに適用し、CssBaselineを追加して基本のスタイルリセットを行います。

import { ThemeProvider, createTheme, CssBaseline } from '@mui/material';

const customTheme = createTheme({
  palette: {
    primary: { main: '#1976d2' },
  },
});

function App() {
  return (
    <ThemeProvider theme={customTheme}>
      <CssBaseline />
      {/* アプリケーション全体のコンポーネント */}
    </ThemeProvider>
  );
}

sxプロップが適用されない

sxプロップを使ったスタイリングが反映されない場合、@mui/systemがインストールされていない可能性があります。

sxプロップを使用するためには、@mui/systemの依存関係をインストールする必要があります。

npm install @mui/system

その後、以下のように使用します。

<Box sx={{ bgcolor: 'primary.main', padding: 2 }}>スタイル適用済みBox</Box>

emotionに関連するスタイルエラー

Cannot find module '@emotion/react'というエラーが発生することがあります。MUIではv5からemotionライブラリがデフォルトで使用されるため、依存関係が不足しているとエラーが発生します。

emotionに関連するパッケージをインストールします。

npm install @emotion/react @emotion/styled

その後、通常通りMUIコンポーネントを使用します。

ドキュメントでは見つけにくい設定のヒント

コンポーネントのツリーシェイキング

MUIでは、不要なコンポーネントがバンドルに含まれないようにする「ツリーシェイキング」をサポートしています。これを有効にするには、必ず個別のコンポーネントをインポートするようにしましょう。

// 悪い例: すべてのコンポーネントがインポートされる
import * as MaterialUI from '@mui/material';

// 良い例: 必要なコンポーネントのみインポートする
import { Button, TextField } from '@mui/material';

sxプロップでテーマに依存したスタイリングを行う

sxプロップを使うと、MUIのテーマに基づいたスタイリングを簡単に行えます。たとえば、テーマの間隔(spacing)やカラーパレットを参照することができます。

<Box
  sx={{
    bgcolor: 'primary.main',  // テーマのprimaryカラーを使用
    padding: (theme) => theme.spacing(2),  // テーマのspacing関数を使用
  }}
>
  カスタムスタイルのBox
</Box>

これにより、テーマに基づいた一貫性のあるスタイリングが簡単に実現できます。

Drawerのブレークポイントに応じたレスポンシブ制御

Drawerコンポーネントは、レスポンシブデザインに適したナビゲーションの実装に使えます。varianttemporaryまたはpersistentに設定し、ブレークポイントごとに挙動を切り替えることが可能です。

<Drawer
  variant={isMobile ? 'temporary' : 'permanent'}
  open={open}
  onClose={toggleDrawer}
>
  {/* Drawerの内容 */}
</Drawer>

関連記事

強力なUIコンポーネントライブラリ「MUI(Material-UI)」について《テーマ・スタイリング編》
# MUIのテーマカスタマイズ MUI(Material-UI)はデフォルトのテーマをベースに、簡単にテーマをカスタマイズできる柔軟なシステムを提供しています。これにより、アプリケーションのデザインをブランドや要件に合わせて調整可能です。 [...]
2024年10月15日 11:56
強力なUIコンポーネントライブラリ「MUI(Material-UI)」について《コンポーネント編》
# 基本的なコンポーネントの使用方法 MUIは、豊富なUIコンポーネントを提供しており、それを使うことでReactアプリケーションの開発を迅速に進められます。 ここでは、MUIでよく使用される基本的なコンポーネントであるボタン、テキストフィ [...]
2024年10月15日 10:32
強力なUIコンポーネントライブラリ「MUI(Material-UI)」について《概要編》
# はじめに ウェブアプリケーションの開発において、デザインと使いやすさを両立することは非常に重要です。MUI(Material-UI)は、Reactと組み合わせて簡単に洗練されたユーザーインターフェースを構築できる強力なUIコンポーネントライブ [...]
2024年10月15日 10:10
【React】React-ToastifyのカラーテーマとPCの外観モードを連動させる方法【TypeScript】
# はじめに Webアプリでユーザー情報の変更などを行った際、処理が正常に完了したことをユーザーに伝えるために、画面の端に一時的にメッセージを表示する機能のことを「トースト」といいます。 >トーストとは、主にデスクトップアプリケーションの機 [...]
2022年7月31日 21:24
RailsアプリにおけるReactの使い方や注意点など
# はじめに [こちらのページ](https://qiita.com/TsutomuNakamura/items/72d8cf9f07a5a30be048)でReactの基本について勉強しました。 Railsアプリの中でReactを利用するとい [...]
2019年12月13日 12:37
【Rails】Railsアプリにreact-railsを追加する手順
# はじめに JavaScriptフレームワークといえば長らくjQuery一強でした。しかし、ここ数年はAngularJSやReact、Vue.jsといった新しいフレームワークがどんどんと登場しています。過去5年間の検索回数の推移を見てみると、2 [...]
2019年12月11日 15:21