<style> - This feature is available in the latest Canary

Canary

React による <style> の機能拡張は、現在 React の Canary および experimental チャンネルでのみ利用可能です。React の安定版リリースでは、<style> は単なる組み込みのブラウザ HTML コンポーネントとして機能します。React のリリースチャンネルについてはこちらをご覧ください

ブラウザ組み込みの <style> コンポーネントを利用することで、ドキュメントにインラインの CSS スタイルシートを追加できます。

<style>{` p { color: red; } `}</style>

リファレンス

<style>

ドキュメントにインラインスタイルを追加するためには、ブラウザ組み込みの <style> コンポーネントをレンダーします。任意のコンポーネントから <style> をレンダーでき、React は特定の場合に対応する DOM 要素をドキュメントの head に配置し、同一のスタイルの重複解消処理を行います。

<style>{` p { color: red; } `}</style>

さらに例を見る

props

<style> は、一般的な要素の props をすべてサポートしています。

  • children: 文字列、必須。スタイルシートの内容です。
  • precedence: 文字列。React がドキュメントの <head> 内で <style> DOM ノードを他と比較してどのように順序付けるかを指定します。これによりどのスタイルシートが他を上書きできるかが決まります。指定可能な値は優先度が低い順に "reset""low""medium""high" です。同じ優先順位を持つスタイルシートは、<link> の場合でもインライン <style> タグの場合でも、あるいは preloadpreinit 関数を使用してロードされた場合でも、一緒に配置されます。
  • href: 文字列。同じ href を持つスタイルに対して React が重複解消処理を行えるようにします。
  • media: 文字列。スタイルの適用を特定のメディアクエリに制限します。
  • nonce: 文字列。厳格なコンテンツセキュリティポリシーを使用する際にリソースを許可するための暗号化 nonce
  • title: 文字列。代替スタイルシートの名前を指定します。

以下は React での使用が推奨されない props です。

  • blocking: 文字列。"render" と設定されている場合、スタイルシートがロードされるまでページを描画しないようブラウザに指示します。React ではサスペンスを通じてより細かい制御を提供します。

特別なレンダー動作

React は <style> コンポーネントをドキュメントの <head> に移動し、同一のスタイルシートの重複解消処理を行い、スタイルシートがロードされている間にサスペンドします。

この動作を有効にするには、props として hrefprecedence を指定してください。React は同じ href を持つスタイルの重複解消処理を行います。precedence はドキュメントの <head> 内における他の <style> DOM ノードとの相対ランクを React に指示することで、どのスタイルシートが他を上書きできるかを決定できるようにします。

この特別な動作に関して、以下の 2 つの注意点があります。

  • スタイルがレンダーされた後、React は props に変更があってもそれを無視します(開発中にこれが起きた場合は React が警告を発します)。
  • コンポーネントがアンマウントされた後も、React は DOM にスタイルを残すことがあります。

使用法

インライン CSS スタイルシートのレンダー

コンポーネントが正しく表示されるために特定の CSS スタイルに依存している場合、インラインスタイルシートを当該コンポーネント内でレンダーできます。

props として hrefprecedence を指定すると、スタイルシートがロードされる間、コンポーネントはサスペンドします。(インラインスタイルシートであっても、スタイルシートが参照しているフォントや画像のためのロード時間が発生することがあります。)props である href は、このスタイルシートを一意に識別する必要があります。React は同じ href を持つスタイルシートに対して重複解消処理を行うからです。

import ShowRenderedHTML from './ShowRenderedHTML.js';
import { useId } from 'react';

function PieChart({data, colors}) {
  const id = useId();
  const stylesheet = colors.map((color, index) =>
    `#${id} .color-${index}: \{ color: "${color}"; \}`
  ).join();
  return (
    <>
      <style href={"PieChart-" + JSON.stringify(colors)} precedence="medium">
        {stylesheet}
      </style>
      <svg id={id}></svg>
    </>
  );
}

export default function App() {
  return (
    <ShowRenderedHTML>
      <PieChart data="..." colors={['red', 'green', 'blue']} />
    </ShowRenderedHTML>
  );
}