Emotion
はじめに
本記事では「モダンJavaScriptの基本から始める React実践の教科書」で学んだ内容と別途気になって調べた内容や知識も含めアウトプットしています。
書籍に記載されている内容を順序立ててまとめるというよりは、整理しておきたい周辺の知識と深ぼった内容を雑多に書いています。
Emotion
Emotionは、CSS-in-JS(JavaScript内でCSSを記述する手法)の一つで、前回の記事にまとめていたstyled componentと並んで根強い人気があります。
公式: https://emotion.sh/docs/introduction
インストール
emotionにはreact専用のパッケージが用意されています。
yarn add @emotion/react
また、styled componentのような使い方ができるパッケージもあります。
yarn add @emotion/styled @emotion/react
公式: https://emotion.sh/docs/styled
emotionは幅広い書き方に対応していますが、公式で明確に定義されているスタイルに従って解説します。
Object Styles
オブジェクトスタイルでは、スタイルをJavaScriptのオブジェクトとして表現します。
公式: https://emotion.sh/docs/css-prop#object-styles
インポートしたcss関数を使ってCSSのオブジェクトを返し、css
プロパティにを渡しています。
import { jsx, css } from '@emotion/react'; const App = () => { return ( <div css={css` background-color: hotpink; &:hover { color: lightgreen; } `} > これはホットピンクの背景色です。 </div> ); }; export default App;
下記のように変数定義することも可能です。
css
関数を使ってスタイルを定義し、style
という変数に格納し、<div>
要素のcss
プロパティに定義した変数style
を渡しています。
import React from "react"; import { css } from '@emotion/react'; const style = css` background-color: hotpink; &:hover { color: lightgreen; } `; const App = () => { return ( <div css={style}> これはホットピンクの背景色です。 </div> ); }; export default App;
styleの中身(css関数の返り値)は下記のようになっていました。
実際のスタイル情報を格納しているオブジェクトが含まれています。
{name: "vrif1i", styles: " background-color: hotpink; &:hover { color: lightgreen; } ", map: undefined, next: undefined, toString: ƒ toString()}
String Styles
文字列スタイルでは、CSSを文字列として直接指定します。
公式: https://emotion.sh/docs/css-prop#string-styles
import React from "react"; /** @jsxImportSource @emotion/react */ import { css } from '@emotion/react'; const color = 'darkgreen' const App = () => { return ( <div css={css` background-color: hotpink; &:hover { color: ${color}; } `} > This has a hotpink background. </div> ); }; export default App;
上記の例では、テンプレートリテラル(``**)で囲まれた文字列を使ってスタイルを指定しています。**
css`プロパティに文字列として直接スタイルを渡すことで、スタイルを定義しています。
ホットピンクの背景色と、ホバー時にライトグリーンの文字色が適用されるスタイルが指定された<div>
要素を表示しています。
また、変数を使用してスタイルを定義し、その変数をcss
プロパティに渡すことも可能です。
import React from "react"; /** @jsxImportSource @emotion/react */ import { css } from '@emotion/react'; const color = 'darkgreen'; const backgroundColor = 'hotpink'; const style = css` background-color: ${backgroundColor}; &:hover { color: ${color}; } `; const App = () => { return ( <div css={style}> This has a hotpink background. </div> ); }; export default App;
上記の例では、css
関数を使用してスタイルを定義し、変数 style
に格納しています。その後、css
プロパティに定義した変数 style
を渡しています。
文字列スタイルは、スタイルを直感的に指定する方法です。テンプレートリテラルを使用することで、動的なスタイルの定義も容易に行うことができます。
styled
下記は@emotion/styled
パッケージを使用してReactコンポーネントにスタイルを適用する例です。
styled
関数を使用して、div
要素にスタイルを適用する新しいコンポーネント CustomDiv
を定義しています。
styled.div
の形式で定義されたコンポーネントは、指定したスタイルが適用されたdiv
要素を生成するために使用されます。
import React from "react"; import { css } from "@emotion/react"; import styled from "@emotion/styled"; const CustomDiv = styled.div` background-color: hotpink; &:hover { color: lightgreen; } `; export default function App() { return ( <div className="App"> <h1>Hello CodeSandbox</h1> <h2>Start editing to see some magic happen!</h2> <CustomDiv>This has a hotpink background.</CustomDiv> </div> ); }
styled
関数から生成されたコンポーネントは、他のReactコンポーネントと同様に使用できますが、スタイル情報が正確に適用されるためには、コンポーネントの名前が大文字で始まる必要があります。
まとめ
Emotionは効率的なスタイルの管理と柔軟なスタイルの表現を実現できるため、開発者にとって便利なツールですが
幅広いスタイリングに対応できるからこそ、チーム内でのスタイルガイドやコーディング規約の確立、ドキュメントの共有など、コードベース全体の一貫性を保つことに注意する必要があります。
参考
続く…
コメント
本記事の内容は以上になります!
書籍の続きのアウトプットも随時更新したいと思います。
プログラミングスクールのご紹介 (卒業生より)
お世話になったプログラミングスクールであるRUNTEQです♪
こちらのリンクを経由すると1万円引きになります。
RUNTEQを通じて開発学習の末、受託開発企業をご紹介いただき、現在も双方とご縁があります。
もし、興味がありましたらお気軽にコメントか、TwitterのDMでお声掛けください。