Material UI はスタイルを定義する為の CSS in JS モジュールを提供してます。
インストール
スタイル作成ユーティリティは@material-ui/styles
または、@material-ui/core/styles
から取り込めます。取り込む前に以下のどちらか適切な方でそれらをインストールする必要があります。
yarn add @material-ui/style
# または、
yarn add @material-ui/core
使う
スタイルを作成するユーティリティ関数は3つあります。
withStyles
makeStyles
styled
これら3つの中身は正味 JSS で、以下の7つのプラグインを使うインスタンスを使ってます。
JSSjss-plugin-rule-value-functionjss-plugin-globaljss-plugin-nested
JSSjss-plugin-rule-value-functionjss-plugin-globaljss-plugin-nestedjss-plugin-camel-case
JSSjss-plugin-rule-value-functionjss-plugin-globaljss-plugin-nestedjss-plugin-camel-casejss-plugin-default-unit
JSSjss-plugin-rule-value-functionjss-plugin-globaljss-plugin-nestedjss-plugin-camel-casejss-plugin-default-unitjss-plugin-vendor-prefixer
JSSjss-plugin-rule-value-functionjss-plugin-globaljss-plugin-nestedjss-plugin-camel-casejss-plugin-default-unitjss-plugin-vendor-prefixerjss-plugin-props-sort
独自のインスタンスを使う
JSS インスタンスを作りStylesProvider
コンポーネントに渡すことで、プラグインを追加したり、いらない機能を削除できます。
import {create} from 'jss';
import {
StylesProvider,
jssPreset
} from '@material-ui/core/styles';
import rtl from 'jss-rtl';
const jss = create({
plugins: [
// 上記の7つのプラグインがほしい場合、
// コメントアウト
// ...jssPreset().plugins,
rtl()
]
});
export default () => {
return (
{/* ... */}
);
};
withStyles
JSSjss-plugin-rule-value-functionjss-plugin-globaljss-plugin-nestedjss-plugin-camel-casejss-plugin-default-unitjss-plugin-vendor-prefixerjss-plugin-props-sortwithStyles はHOC(higher-order component)を作る為のユーティリティです。これは以下のように使います。
const propInjector = withStyles(
style,
options
);
style
にはクラスの目印(クラスキー)をプロパティ、 JSS プラグインによって許される様々なスタイルの値をバリューとしたオブジェクト、またはそれを返す関数を置きます。
JSS プラグインによって許される様々なスタイルの値とは以下のような種類があります。
スタイルがオブジェクトなのが一番普通ですが、
const styles = {
// root はクラスキー
root: {
// CSSProperties
color: 'orange',
// CreateCSSProperties
'&:hover': {
background: 'blue'
},
background: props =>
props.background
}
};
スタイルはprops
を引数に渡される関数にもなれます。
const styles = {
root: props => ({
color: 'orange',
'&:hover': {
background: 'blue'
},
background: props.background
})
};
また、それを返す関数とはテーマオブジェクトを引数に渡さる関数で、その戻り値は上記のstyles
のような値になります。
const styles = theme => {
root: props => ({
background: props.background
});
};
このtheme
にはThemeProvider
などを使ってテーマオブジェクトを渡すことができます。
withStyles
によって得たpropInjector
へコンポーネントを引数として渡して実行することで、そのコンポーネントはclasses
オブジェクトをプロパティから扱えます。このオブジェクトはクラスキーとそのクラスキーと対になる実際の HTML クラス名(のグループ)になっているので、
のようにクラス名に適切なクラス名が当てられるようにします。
またpropInjector
で得られたコンポーネントはclasses
プロパティを渡せるようになります。
const FooWithClasses = propInjector(
Foo
);
このclasses
プロパティにwithStyles
を使う時に定義したものと同じクラスキーとクラス名のオブジェクトを渡すと、Foo
内部で受け取るclasses
は定義時に作られたものととプロパティとして渡されたものの同じクラスキーのクラス名を組み合わせたものになります。
const classes = {
root:
'定義時の`classes.root` プロパティで渡さた`classes.root`'
};
Material-UI: the key `heading` provided to the classes prop is not implemented in App.
You can only override one of the following: root.
makeStyles
JSSjss-plugin-rule-value-functionjss-plugin-globaljss-plugin-nestedjss-plugin-camel-casejss-plugin-default-unitjss-plugin-vendor-prefixerjss-plugin-props-sortwithStyles使った時に使っていないクラスキーを含めるmakeStylesはclasses
を返す React カスタムフックを作るためののユーティリティーです。これは、withStyles
を作るう時のstyle
と同じ値を引数に渡して実行します。
const useStyles = makeStyles(theme => {
root: props => ({
background: props.background
});
});
後はこのuseStyles
をコンポーネント内部で実行すればclasses
が受け取れます。
const classes = useStyles();
/**
* classes === {
* root: 'makeStyles-root-9',
* };
**/
また、このカスタムフックは引数にprops
が渡せ、それをスタイルオブジェクト部分で受け取れます。
styled
JSSjss-plugin-rule-value-functionjss-plugin-globaljss-plugin-nestedjss-plugin-camel-casejss-plugin-default-unitjss-plugin-vendor-prefixerjss-plugin-props-sortwithStyles使った時に使っていないクラスキーを含めるmakeStylesstyled を使って、JSSjss-plugin-rule-value-functionjss-plugin-globaljss-plugin-nestedjss-plugin-camel-casejss-plugin-default-unitjss-plugin-vendor-prefixerjss-plugin-props-sortwithStyles使った時に使っていないクラスキーを含めるmakeStylesstyledstyled-components のような感じでスタイル付けすることができます。「のような感じ」というのは、実際には styled-components ではない為です。その為、
styled(Button)`
color: orange;
`;
のようなタグ付けテンプレートリテラルでスタイルを記述したりはできないようです。