「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > ヘッドレスコンポーネントのスタイル設定を容易にする

ヘッドレスコンポーネントのスタイル設定を容易にする

2024 年 8 月 26 日に公開
ブラウズ:610

Making headless components easy to style

ヘッドレス コンポーネントは単にスタイルが設定されていないコンポーネントですか?それともそれ以上の意味がありますか?

ウェブでは、スタイルの定義を要求することで、すでにスタイルとコンテンツを分離しています
HTMLではなくCSSで。このアーキテクチャにより、各 Web ページでグローバル
を採用できます。 ページ固有のスタイルを定義せずに標準のデザインを作成します。

Web がアプリケーション プラットフォームに進化するにつれ、開発者は次の方法を模索しました。
増大するコードベースの保守性が向上します。現在、
の事実上の戦略 アプリケーション コードを整理することは、
を実行できる小さくて軽量なコンポーネントを定義することです。 一緒に構成されます。したがって、コンポーネントは
の構成単位になりました。 最新の Web 開発。

コンポーネントは、カプセル化のために HTML と CSS の両方を定義することがよくあります。
これにより作曲が容易になりますが、
が難しくなる可能性があります。 既存のデザインシステムに一体的に組み込むことができます。これは特に当てはまります
外部ベンダーからインポートされたサードパーティ コンポーネントの場合。

ヘッドレスコンポーネントは、
間の分離を再導入することでこの課題を解決します。 内容もスタイルも。ただし、現在、分離は
のようにコンポーネントの境界に沿っています。 HTML と CSS の間では反対です。これらは優れたヘッドレス コンポーネントを作成するための鍵となります
開発者が
できるようにコンポーネントのインターフェイスを設計することにあります。 独自のスタイルを明確かつ簡単に適用できます。

関連する小道具を転送する

最も基本的な意味では、ヘッドレス コンポーネントは単にスタイルのないコンポーネントです。
開発者は、
が適用される HTML 要素に独自の CSS を適用できる必要があります。 コンポーネントが定義します。

単純なコンポーネントの場合、これは単に className を転送するだけの問題かもしれません
開発者が
でクラス セレクターを使用できるように、ルート要素に prop を追加します。 CSS.

コンポーネントがネイティブ HTML 要素と同じセマンティクスを持っている場合は、
を使用できます。 React の ComponentProps タイプを使用して、関連するすべての props が
であることを確認します。 転送可能。ユーザーに使用させたくない小道具は必ず省略してください
コンポーネントをオーバーライドできるようにします。

import { type ComponentProps } from 'react'

function SubmitButton({ ...props }: Omit, 'type'>) {
  return 
}

事前定義されたクラスを提供する

1 つ以上の子要素を含むコンポーネントの場合、開発者はおそらく
各要素を個別にスタイルしたい。

これをサポートする 1 つの戦略は、
に依存することです。 CSS コンビネータ。
たとえば、ヘッドレス ギャラリー コンポーネントは次のようにスタイル設定されます:

/* Root container */
.gallery {
}

/* Gallery items container */
.gallery > ul {
}

/* Gallery item */
.gallery > ul > li {
}

/* Next and Previous buttons */
.gallery button {
}

しかし、このアプローチでは大きな問題が発生します。なぜなら、
の内部 HTML 構造が変更されてしまうからです。 コンポーネントはパブリック API の一部です。これにより、
を変更できなくなります ダウンストリームのコードを壊す可能性がなく、後で構造化できます。

より良い戦略は、主要な子要素ごとにクラスを事前定義することです。こちらです
開発者は特定の HTML に依存せずにクラス セレクターを使用できる
構造:

.xyz-gallery {
}

.xyz-gallery-next-button {
}

.xyz-gallery-previous-button {
}

.xyz-gallery-items-container {
}

.xyz-gallery-item {
}

クラスが
と衝突しないように、必ず接頭辞を付けてください。 開発者自身のスタイル。

カスタムレイアウトのサポート

事前定義されたクラスを提供することは、おそらく開発者が次のことを可能にする最も簡単な方法です
コンポーネントのスタイルを設定します。ただし、このアプローチの欠点は、
HTML 構造はカスタマイズできません。

これは関係ないかもしれません。結局のところ、プレーン HTML はすでにその方法においてかなり柔軟です
レンダリングできます。ただし、開発者が順番に追加の HTML に手を伸ばす場合があります
特定のデザインを実現するため。ほぼすべてのソースコードを表示すると
Web サイトでは、多数の非セマンティックな

要素が表示されることが予想されます。
その唯一の目的は、フレックスまたはグリッド レイアウトを定義し、視覚的に子をグループ化することです
境界線内の要素を削除するか、新しいスタッキング コンテキストを作成します。

ヘッドレスコンポーネントを次のように分割することで、そのようなユースケースをサポートできます
複数の関連コンポーネント。このようにして、開発者は独自の
を自由に追加できます レイアウト要素をコンポーネントに追加します。たとえば、開発者は Next と
を埋め込むことができます。 カスタム フレックスボックス コンテナ内のギャラリーの例の前のボタン:


    {data.map((item) => (
      {item.content}
    ))}
  
.gallery-items-container {
}

.gallery-buttons-container {
  display: flex;
  gap: 0.5rem;
  justify-content: flex-end;
}

これらの種類のコンポーネントは通常、
を使用して実装されます。 渡すコンテキスト
お互いの間のデータ。設計、実装、
にはさらに多くの作業が必要です 書類。ただし、その結果得られる多用途性は、多くの場合、追加の労力を意味します
価値がある。

コンポーネントの上書きを許可する

少数のユースケースでは、ヘッドレス コンポーネントでレイアウトを管理する必要があります
その子コンポーネントの。例としては、
の階層ツリー ビューが挙げられます。 ドラッグ アンド ドロップで項目を並べ替えることができます。別の使用例は、
です。 シングルページアプリケーションがデフォルトのアンカー要素を
に置き換えることを許可します。 クライアント側のルーティングを容易にするカスタム リンク コンポーネント。

開発者がカスタム レイアウトを定義できるようにするための高度な戦略は、
レンダリングされる実際の子コンポーネントを props:
経由でオーバーライドできるようにします。

}} />

これにより、開発者は各子でレンダリングされる内容を完全に制御できるようになります
コンポーネントを使用しながら、ヘッドレス コンポーネントがその全体を管理できるようにします
構造。

開発者がコンポーネントのルート要素をカスタマイズできるようにすることもできます
プロップ経由で。たとえば、このボタン コンポーネントを使用すると、開発者はそれをレンダリングできます
別のものとして:

import { type ElementType } from 'react'

function HeadlessButton({ as, ...props }: { as?: ElementType }) {
  const Component = as ?? 'button'
  return 
}

たとえば、支援技術でボタンをリンクのように扱うには、
開発者は、アンカー要素を使用して
をレンダリングするように指定できます。 ボタン:

Actually a link

まとめ

ヘッドレス コンポーネントは、何も含まないコンポーネントよりもはるかに優れています
スタイル。優れたヘッドレス コンポーネントは完全に拡張可能で、開発者
内部 HTML 構造全体をカスタマイズします。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/jcmosc/making-headless-components-easy-to-style-89m?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3