0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MUIを1年使ってみてわかったことを書き殴る

Posted at

はじめに

今年の 3 月からフロントエンドエンジニアとして働いています。

エンジニアとして就労する前から、コンポーネントライブラリは、MUI を使っています。

就労後も、現場で使っているコンポーネントライブラリがたまたま MUI でした。

つまり、MUI を触るようになって 1 年が経過していました。(あっという間の 1 年でした。。。)

この 1 年で学んだこと苦戦したことの多くは、MUI の操作だったんじゃないかと思ったので、備忘録として記事にまとめます。

間違った情報などありましたら、コメントで教えていただけますと幸いです。🙇‍♂️

MUI とは?

MUI とは、React で利用できる UI コンポーネントライブラリの1つです。

プロジェクトに、ライブラリをインストールするだけで、コンポーネントとして扱えます。

例えば、下のようなSwitchコンポーネントを作りたいシーンがあったとします。

muisample.gif

MUI を使ったら、下の記述だけで完結できます。

Switch.tsx
import { Switch } from "@mui/material";

export default function sample() {
  return <Switch />;
}

かなり簡単ですよね?

これがコンポーネントライブラリの素晴らしいところです。

この記事で書きたいこと

MUI を使えばプロジェクトに、コンポーネントを、簡単に作ることができます。

ですが、デフォルトコンポーネントから変化を与えたい場合があると思います。

先ほどのSwitchコンポーネントで言うと、

  • 色を変更したい
  • トグルのスピードを速さを調節したい
  • サイズを大きくしたい

など、デザインのコンポーネントに合わせるためには、いろいろ変更を加える必要があると思います。

こんな場合でも、MUI で用意されている API に適切な props を渡すことで、UI の状態を変えることができます。

ほとんどのコンポーネントには、sx と言う props が用意されており、CSS in JS を書くことができます。

ですが、私が入った現場では、メンテナンス性、可読性を考慮して sx を極力使わない方針をとっていました。

「使えそうな props があるか、どんな感じで探していたのか」 について記録をまとめたいと思います。

Switch の色を変更したい

Gif のようにトグルの色は、デフォルトが青です。これを変更してみます。

muisample.gif

MUI で Switch のドキュメントを開きました。

スクリーンショット 2024-12-29 13.01.39.png

ドキュメントを開いたらColorが用意されてます。すでに用意されているColorで問題なければ、color に定義されている props を渡すだけで色を変化できそうです。

color と書き加えたプロパティにマウスをホバーしてみましょう。デフォで、secondaryprimaryerrorinfosuccesswarningdefaultが割り当てられています。

スクリーンショット 2024-12-29 13.07.39.png

下のように color にsecondaryを渡してみました。

Switch.tsx
import { Switch } from "@mui/material";

export default function Sample() {
  return <Switch
  color="secondary"
  />;
}

すると、下のようにSwitchコンポーネントの色を簡単に変更できました。めちゃ簡単ですね。

画面収録 2024-12-29 13.10.55.gif

デフォルトで用意されている色以外を割り当てたい場合

おそらくデフォルトで用意されている色以外を割り当てたい場合がほとんどだろうと思います。

やり方はいくつかあると思いますが、1 つピックアップして紹介したいと思います。

  • global.tsx で色を変更させる

global.tsx で色を変更させる

Switch コンポーネントの color に、デフォルトで割り当てられている、secondaryprimaryerrorinfosuccesswarningdefaultの色に上書きする方法です。

これはやったことなかったけど、ずっと試してみたかった方法でした。よくわかんなかったので chatGPT に質問したところ、下のような ThemeProvider を提供してくれました。

global.tsx
import { createTheme, ThemeProvider as Provider } from "@mui/material/styles";

// カスタムテーマの作成
const theme = createTheme({
  components: {
    MuiSwitch: {
      styleOverrides: {
        // secondaryのスタイルをカスタマイズ
        colorSecondary: {
          "&.Mui-checked": {
            color: "blue", // チェックされた状態のアイコンの色
          },
          "&.Mui-checked + .MuiSwitch-track": {
            backgroundColor: "blue", // チェックされた状態のスライダー背景色
          },
        },
      },
    },
  },
});

interface ThemeType {
  children: React.ReactNode;
}

export default function ThemeProvider({ children }: ThemeType) {
  return <Provider theme={theme}>{children}</Provider>;
}

さて、先ほど Switch に渡していたcolor="secondary"の色は変化したのでしょうか?

画面収録 2024-12-29 13.58.56.gif

どうやら無事にsecondaryの色を変更できたようです。

これだとどう言う仕組みで色が変化したのかわからないので、少しコードを折ってみましょう。

まず、下のcreateThemecomponentsを探します。

createThemeをコマンド+ホバーすることで createTheme に遷移できます。

global.tsx
const theme = createTheme({
  components: {
    // ↓下を探す
    MuiSwitch: {
      styleOverrides: {
        // secondaryのスタイルをカスタマイズ
        colorSecondary: {
          "&.Mui-checked": {
            color: "blue",
          },
          "&.Mui-checked + .MuiSwitch-track": {
            backgroundColor: "blue",
          },
        },
      },
    },
  },
});

createThemeの引数としてcomponentsが受け取れることを確認できました。

スクリーンショット 2024-12-29 14.08.03.png

では、componentsの中身を確認するために、CssVarsThemeOptionsに遷移して確認してみましょう。

CssVarsThemeOptionsの中にcomponentsがあることを確認しました。

スクリーンショット 2024-12-29 14.16.24.png

componentsに渡せるのはComponentsで持ってるものみたいです。Componentsに遷移しましょう。

さて、componentsまでやってきました。下の Theme を思い出してください。

global.tsx
const theme = createTheme({
  components: {
    // ↓下を探す
    MuiSwitch: {
      styleOverrides: {
        // secondaryのスタイルをカスタマイズ
        colorSecondary: {
          "&.Mui-checked": {
            color: "blue",
          },
          "&.Mui-checked + .MuiSwitch-track": {
            backgroundColor: "blue",
          },
        },
      },
    },
  },
});

Componentsの中にはMuiSwitchが存在するはずです。ファイルの中で検索をかけてみてください。

スクリーンショット 2024-12-29 14.25.04.png

styleOverridesで渡してるComponentsOverridesを確認します。

ComponentsOverridesの中で、MuiSwitchを検索かけます

スクリーンショット 2024-12-29 14.33.12.png

ありました。SwitchClassKeyの中身を確認してください。

colorSecondary: string;が見つかりました。このプロパティに文字列で渡したら Switch コンポーネントの secondary だけに色を反映させられるようです。(追うのがこんなに長い説明になると思ってなかったです、、、お疲れ様でした。)

スクリーンショット 2024-12-29 14.34.51.png

でも、chatGPT に書いてもらったcolorSecondaryは、色を渡してるだけではありませんね 🤔
"&.Mui-checked": { color: "blue", },

これに関しては、Switch コンポーネントの公式ドキュメントを見てみます。

Switch API というページの CSS classes を見てください。

翻訳すると、下のように書いてありました。

内部 SwitchBase コンポーネントの checked クラスに適用される状態クラス。

つまり、checkedが入ってるときの色指定みたいですね。

スクリーンショット 2024-12-29 14.47.51.png

この場合は、&クラス名とすることで、色の指定ができるようでした。

こんな感じで、global.tsx としてコンポーネントの Theme を一元管理できるんです。

でも、毎回グローバルで色を定義するのも面倒ですよね。

下の記事でコンポーネント単位で色を指定する方法を書いてます。

よかったら、見てみてください。🙇‍♂️

おわりに

デフォで用意されている color を上書きする方法をまとめました。

書きながらprimarysecondary以外の色ってどうやって変更するの??という疑問が浮かびましたが、記事がかなり長くなりそうだったので、この記事では割愛させてもらいました 🙇‍♂️

私事ですが、今年はエンジニア1年目でかなりバタバタな1年でした。

テックブログも9月から書き始めQiitazennを合わせて5記事書きました。

来年は、毎月1記事、年間12記事書けるように頑張りたいと思います。

ここまで読んでくれてありがとうございました。🙇‍♂️

良いお年を!🎍

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?