0Pricing
React Academy · レッスン

Object Propsによる名前付きスロット

名前付きPropsでJSXを渡し、header/body/footerスロットを実装します

「Object Propsによる名前付きスロット」はCoddyKit上の無料React Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。

ようこそ

このレッスンでは、名前付きプロパティを通してJSXを渡し、柔軟な名前付きスロットを実装します。これにより、固定的なchildren構造を使わずに、header、body、footerの領域を持つレイアウトコンポーネントを作成できます。

childrenの制限

単一の `children` プロパティは1つの領域に適しています。コンポーネントに複数の独立したコンテンツ領域(headerとfooterを持つカードなど)が必要な場合は、JSXを格納する名前付きプロパティがすっきりした解決策になります。

名前付きプロパティによるスロット

コンポーネントのインターフェースで、各スロット用のプロパティを定義します。親は各プロパティにJSXを渡し、コンポーネントはそれぞれのスロットを適切な位置に描画します。
function Card({ header, body, footer }) {
  return (
    <div className="card">
      <div className="card-header">{header}</div>
      <div className="card-body">{body}</div>
      <div className="card-footer">{footer}</div>
    </div>
  );
}

// Usage
<Card
  header={<h2>Title</h2>}
  body={<p>Content here</p>}
  footer={<button>OK</button>}
/>

省略可能なスロット

プロパティがtruthyの場合だけ描画することで、スロットを省略可能にできます。たとえば、footerの有無にかかわらず同じコンポーネントを使えるようになります。
function Card({ header, children, footer }) {
  return (
    <div>
      {header && <div className="header">{header}</div>}
      <div className="body">{children}</div>
      {footer && <div className="footer">{footer}</div>}
    </div>
  );
}

childrenと名前付きスロットの併用

主要なコンテンツ領域には `children` を使い、補助的な領域には名前付きプロパティを使います。最も一般的な使い方を最も扱いやすくするという原則に沿った方法です。
<Dialog
  title="Confirm"
  actions={<><button>Cancel</button><button>OK</button></>}
>
  <p>Are you sure?</p>  {/* children = primary slot */}
</Dialog>

TypeScript: 名前付きスロットの型付け

名前付きスロットのプロパティには `React.ReactNode` 型を指定して、任意のJSXコンテンツを受け入れられるようにします。
interface CardProps {
  header?: React.ReactNode;
  children: React.ReactNode;
  footer?: React.ReactNode;
}

名前付きスロットとコンパウンドコンポーネントの比較

名前付きプロパティはシンプルで明示的です。コンパウンドコンポーネント(`` など)は、複雑なコンポーネント群ではより扱いやすい一方、Contextを使った追加の構成が必要です。まずは名前付きプロパティから始め、必要に応じて移行してください。

コンポーネントをスロットとして渡す

スロットをJSXではなくReactコンポーネントとして型付けすることもできます。親はコンポーネントへの参照を渡し、レイアウトがそれを描画します。これにより、スロットをいつ、何回描画するかをレイアウト側で制御できます。
function Timeline({ renderItem, items }) {
  return (
    <ul>
      {items.map(item => (
        <li key={item.id}>{renderItem(item)}</li>
      ))}
    </ul>
  );
}

<Timeline
  items={data}
  renderItem={item => <EventCard event={item} />}
/>

名前付きスロットによるレイアウト構成

ページレイアウトコンポーネントでは、名前付きスロットを頻繁に使います。`sidebar`、`toolbar`、`content` スロットを持つページシェルコンポーネントを使うと、各ページで領域ごとにまったく異なるコンテンツを組み合わせながら、同じシェルを利用できます。

名前付きスロットのドキュメント化

名前付きスロットは、TypeScriptのインターフェースやPropTypesによって、それ自体がドキュメントになります。利用側は使用可能なスロットと省略可能なスロットを正確に確認できるため、外部ドキュメントの必要性を減らせます。

確認問題

任意のJSXを受け入れる名前付きスロットのプロパティには、どのTypeScript型を使うべきですか?

復習

名前付きスロットのプロパティを使うと、レイアウトコンポーネントを柔軟で自己文書化されたものにできます。メイン領域にはchildren、補助的な領域には名前付きプロパティを使い、それらの型にはReact.ReactNodeを指定します。

次のレッスン

次のレッスン: **cloneElementによるプロパティの複製と注入** — React.cloneElementを使って、親から子要素へ暗黙的なプロパティを渡します。

よくある質問

「Object Propsによる名前付きスロット」レッスンは無料ですか?

はい。「Object Propsによる名前付きスロット」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。

「Object Propsによる名前付きスロット」で何を学びますか?

名前付きPropsでJSXを渡し、header/body/footerスロットを実装します ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

React Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「Object Propsによる名前付きスロット」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このReact Academyレッスンでコードを書いて実行できますか?

はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. props.childrenの基礎
  2. React.Childrenユーティリティ
  3. Object Propsによる名前付きスロット
  4. cloneElementでPropsを複製・注入する
← React Academyに戻る