@emotion/react での React コンポーネントの書き方

kimizuy

はじめに

こんにちは。kimizuy です。

@emotion/react を使った React コンポーネントの基本的なスタイリング例を紹介します。

@emotion/react のメリットについてはこちらの記事が詳しいです。

String Styles

ref: https://emotion.sh/docs/css-prop#string-styles

タグ付きテンプレートリテラルを使って CSS の記法を保ったままスタイルを書くことができ、個人的にはこちらを好んで使っています。

世にある CSS コードをそのままコピペして利用できるのは楽でいいのですね。

以下に例を示します。

const Button = ({ backgroundColor }) => (
  <button
    css={[
      css`
        outline: none;
        border: none;
        display: block;
        box-sizing: border-box;
        padding: 16px 32px;
        font-size: 0.75rem;
        font-weight: 600;
        box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 4px inset;
        text-align: center;
        background-color: ${backgroundColor}
      `
    ]}
  />
);

Object Styles

ref: https://emotion.sh/docs/css-prop#object-styles

オブジェクトでのスタイリングでも可能です。JavaScript の書き方で統一したい方はこちらですね。

以下に例を示します。

const Button = ({ backgroundColor }) => (
  <button
    css={[
      variation === "primary" && {
        backgroundColor: `rgb(236, 233, 251)`,
        color: `rgb(111, 62, 209)`
      },
      // テンプレートリテラルとの併用も可
      variation === "secondary" &&
        css`
          background-color: rgb(111, 62, 209);
          color: rgb(236, 233, 251);
        `
    ]}
  />
);>

引数を受け取るスタイル

@emotion/react の特徴的な点として、関数のように引数を受け取るスタイルを書くことができます。

const style = (args) => css`...some style`

一番最初の例を改変する形で、実際のスタイリング例を以下に示します。

const buttonStyle = (backgroundColor) =>
  css`
    outline: none;
    border: none;
    display: block;
    box-sizing: border-box;
    padding: 16px 32px;
    font-size: 0.75rem;
    font-weight: 600;
    box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 4px inset;
    text-align: center;
    background-color: ${backgroundColor}
  `

const Button = ({ backgroundColor }) => (
  <button
    css={[buttonStyle(backgroundColor)]}
  />
);t

さいごに

@emotion/react の基本的な使い方として 3 パターンのコンポーネントの書き方をご紹介しました。

本記事が誰かのお役に立てれば幸いです。

Gaji-Laboでは、React経験が豊富なフロントエンドエンジニアを募集しています

弊社ではReactの知見で事業作りに貢献したいフロントエンドエンジニアを募集しています。大きな制作会社や事業会社とはひと味もふた味も違うGaji-Laboを味わいに来ませんか?

もちろん、一緒にお仕事をしてくださるパートナーさんも随時募集中です。まずはお気軽に声をかけてください。お仕事お問い合わせや採用への応募、共に大歓迎です!

求人応募してみる!

kimizuy

投稿者 Yamasaki Kimizu

React, Redux, TypeScript プロジェクトでフロントエンド領域を担当。個人でも Next.js アプリの開発をしています。日課はRSSで取得した技術記事を読むこと、最近の関心は Core Web Vitals です。将来はでかい犬が飼いたいです。