@emotion/react での React コンポーネントの書き方 〜〜props から渡す編〜〜

kimizuy

はじめに

こんにちは。kimizuy です。

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

前回: https://blog.gaji.jp/2021/10/05/8219/

今回は外部からコンポーネントの css prop に対してスタイルを渡す書き方の一例を示します。

例えば className prop だと以下のように書くことを css prop だとどう書くでしょうか。

const LoginButton = ({ className }: Props) => (
  <button className={styles.button + (className ? ` ${className}` : "")}>
    ログイン
  </button>
)

あまり @emotion/react を使ったコンポーネントのサンプルが少ないので命名など手探りな部分はありますが、本記事が誰かの一助になれば幸いです。

tldr

css prop には配列を渡すこともできます。

以下のコード例ではコンポーネントは propCss という名前の props を受け取り、それを配列に加えています。

これで、外部から css() で定義されたスタイルを受け取ることができます。

import { css, SerializedStyles } from '@emotion/react'

type StyleProps = {
  color?: string
}

type Props = { propCss?: SerializedStyles } & StyleProps

const style = ({ color }: StyleProps) => css`
  background-color: blanchedalmond;
  color: ${color};
`

export default function HelloWorld({ propCss, ...styles }: Props) {
  return <div css={[style(styles), propCss]}>Hello World</div>
}

このコンポーネントは以下のように使います。

const style = css`
  color: aquamarine;
`

<HelloWorld propCss={style} />

注意点なのは className とは違って css という名前で props を定義できないことです(詳しいことはわかってないが、スタイルが反映されない不具合にあった)。

さいごに

今回は css prop に外部からスタイルを渡す書き方についてご紹介しました。

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

Gaji-Laboでは、Jamstackが得意なフロントエンドエンジニアを募集しています

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

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

求人応募してみる!

kimizuy

投稿者 Yamasaki Kimizu

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