はじめに
現在Reactについて勉強中なのですが、classNameを複数個宣言する方法がわからず調べたことを残しておきます(記録用)。classnamesというモジュールはとりあえずインストールしてていい気がしますね。
classNameとは
Reactではjsx形式を扱いますが、classNameはそこでスタイリングを担当します。htmlで言うところのclassです。
classNameの使い方
divタグにclassName={color_red}を与え、文字を赤色に装飾することができます。htmlを触ったことがある人は理解しやすいと思います。
export default Hello world!(() => {
return (
<div className={color_red}>
<h1>Hello world!</>
</div>
);
});
classNamesの宣言方法
では、classNamesと複数形で宣言する場合はどうなるのでしょうか?
- まず、
npm install --save classnames
でインストールが必要です(これを知らず困った)。 - インストール完了後、ファイルにインポートします。
- 以下のように、classNamesを使うと、複数のクラス名を定義して使うことができます。useStateなどと合わせて、複数の状態を変化させたい場合などに便利です。
import React, { useState } from "react";
import classNames from "classnames";
export default Hello world! () => {
return (
<div className={classNames("signUp", "open")}>
<h1>Hello world!</h1>
</div>
)
}
複数のクラス名を付けたい
classNamesを使うことで複数のクラス名を扱うことができます。
import React, { useState } from "react";
import classnames from "classnames";
export default App() => {
return (
<>
<div className={classnames("signIn", "isOpen")}>
<h1>Hello world!</h1>
</div>
</>
);
}
動的切り替え
useStateを使い、ハンバーガーを食べている状態のスタイリングを変えたいとします。
このとき、statusをsetStatusで切り替えることによって、statusClassNamesが変化させられます。
classNameを、"eating"なのか"finished"なのかに切り替えられるというわけです。
※classNameは別途自分で設定する必要がある(ex. eating時のスタイリング、finished時のスタイリング)。
import React, { useState } from "react";
import classnames from "classnames";
export default function App() {
const [status, setStatus] = useState("eating");
const statusClassNames = {
hamburger: true,
eating: status === "eating",
finished: status === "finished"
};
return (
<>
<div className={classnames(statusClassNames)}>
<h1>A man who likes hamburger in a restaurant</h1>
</div>
</>
);
}
classNamesを使うことで、簡単に動的なスタイリングができます。useStateによる状態管理ができれば、スタイリングの変更も自由自在ですね。
参考にした資料
・Reactのスタイリング(classNameやclassNamesの使い方)
https://qiita.com/terry_6518/items/de53123253cf67e048b3
・React公式ドキュメント(CSS とスタイルの使用)
https://ja.reactjs.org/docs/faq-styling.html
・classnamesパッケージドキュメント
https://www.npmjs.com/package/classnames