styled
styled-components
からstyled
(default
)をインポートして使います。styled[htmlタグ名]
にはそれぞれタグ付けテンプレート構文になっているのでここに CSS を書いていくだけでスタイル付けした要素を作ることができます。実際には
定義した CSS に
styled-components
が適当なクラス名を振るそれを実際に使っている要素の
className
に指定する
といった感じのことをやっています。
以下はスタイル付けdiv
要素を作っている例です。
import styled from 'styled-components';
const StyledDiv = styled.div`
padding: 1em;
`;
foo
作られた要素はそのまま React コンポーネントとして使うことができます。
動的スタイル・動的属性
普通の React コンポーネントがprops
を渡せるようにstyled-components
で作った要素にもprops
を扱える仕組みがあります。それにはタグ付けテンプレート構文の中に関数を埋め込みます。関数を埋め込むとそれにはprops
が渡ってくるのでそれを好きなように触って目的の値を返すようにします。
const MARGIN = '1em';
const StyledDiv = styled.div`
padding: ${props => props.padding || 0};
margin: ${MARGIN};
`;
foo
// padding: 1em;
// margin: 1em;
ちなみに埋め込みには関数以外を指定するとそのまま出力されます。
属性の場合は、attrs
というメソッドがあるのでこれでprops
を受け取るコールバックを定義します。以下はtitle
属性値を少し編集してる例ですが、このように好きな属性値のオブジェクトを返すようにするといいです。
const StyledDiv = styled.div.attrs(props => {
return {
title: `edited ${props.title}`
}
})`
// ...
`;
共通スタイル
styled-components
が提供しているcss
ヘルパーを使うことで共通部分を分けることができます。特にprops
を扱いたいときの共通部分の切り出しには必須です。
import styled, {css} from 'styled-components';
const common = css`
padding: ${props => props.padding || 0};
`;
const StyledFooDiv = styled.div`
${common};
margin: 1em;
`;
const StyledBarDiv = styled.div`
${common};
margin: 2em;
`;
テーマ
親階層でThemeProvider
コンポーネントを使うことでそれ以下のすべてのstyled
要素のprops.theme
に値を渡せます。全体を通して一貫した動的な値を渡すことができます。
import styled, {ThemeProvider} from 'styled-components';
const StyledDiv = styled.div`
padding: ${props => props.theme.padding || 0};
`;
const App = () => (
);
const Root = () => (
);