Tailwind CSSを安全に上書きして補完・ソートもできる自作関数を作ってみた

17861 ワード

自己紹介

現在大学3年生の といいます。
普段はNext.js, React Nativeを中心にフロントエンド開発をしています。

こんな悩みありませんか...?

  • Tailwind CSSのクラス名が上書き出来ない時があって困っている
  • コンポーネントの外からTailwind CSSのクラスをあてたい
  • 自作関数の実引数でTailwind CSS Intellisenseで補完を効かせたい
  • 並べ替えもしたい!!

今回は上記の悩みを解決すべく、私なりに調べた結果をまとめようと思います!!

問題の確認(クラス名上書きの失敗例)

// デフォルトで赤色のタイトルを表示するコンポーネント
type TitleProps = {
  className?: string
  children: string
}
const Title: FC<TitleProps> = ({ className, children }) => {
  return (
    <h2 className={clsx(className, 'text-5xl font-bold text-red-500')}>
      {children}
    </h2>
  )
}

// 複数のタイトルを表示するコンポーネント
const TitleListPage: NextPage = () => {
  return (
    <>
      <Title>赤色のタイトル</Title>
      <Title>赤色のタイトル</Title>
      <Title>赤色のタイトル</Title>
      <Title className='text-blue-500'>青色のタイトル</Title>
      <Title>赤色のタイトル</Title>
      <Title>赤色のタイトル</Title>
      <Title>赤色のタイトル</Title>
      <Title>赤色のタイトル</Title>
      <Title>赤色のタイトル</Title>
    </>
  )
}
export default TitleListPage

結果↓↓
失敗例

結果を見て分かる通り、Titleコンポーネントを呼び出す際のtext-blue-500がうまくいっていません。原因としては、元々のtext-red-500text-blue-500が重複しているため、Tailwind CSS側で先に定義されているtext-red-500が優先されてしまっていると考えられます。

解決策

後ろのクラス名を優先して重複を排除してくれるこちらのライブラリを使います!