0Pricing
React Academy · レッスン

cloneElementでPropsを複製・注入する

React.cloneElementを使って、親から子コンポーネントへ非表示のPropsを渡します

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

ようこそ

このレッスンでは、React.cloneElementを使って子要素を複製し、子要素側が意識する必要のない追加のプロパティを親から注入する方法を学びます。

cloneElementとは

`React.cloneElement(element, props, ...children)` は、既存の要素をもとに新しいReact要素を作成し、新しいプロパティと元のプロパティをマージします。元の要素の型は維持されます。
const clone = React.cloneElement(child, { active: true });

cloneElementを使う理由

親コンポーネントは、子要素が意識することなく、アクティブ状態やイベントハンドラーなどの振る舞いを子要素に注入できます。タブシステム、アコーディオン、フォームグループなどで使われます。

タブバーの例

Tabsコンポーネントは各Tab子要素を複製し、`isActive` と `onClick` のプロパティを自動的に注入できます。そのため、利用側で手動設定する必要がありません。
function Tabs({ children, activeIndex, onChange }) {
  return (
    <div className="tabs">
      {React.Children.map(children, (child, i) =>
        React.cloneElement(child, {
          isActive: i === activeIndex,
          onClick: () => onChange(i),
        })
      )}
    </div>
  );
}

プロパティのマージ規則

cloneElementは新しいプロパティを元のプロパティに**上書きして**マージします。元の要素に同じキーのプロパティがすでにある場合は、新しい値が優先されます。styleとclassNameは、手動で処理しない限りマージされず、上書きされます。

イベントハンドラーのマージ

イベントハンドラーを上書きせずにマージするには、cloneElementに渡す前にコールバックを手動で合成します。
React.cloneElement(child, {
  onClick: (e) => {
    child.props.onClick?.(e); // original handler
    handleClick(e);           // injected handler
  },
})

子要素の置き換え

`cloneElement` の第3引数は、要素の子要素を置き換えます。元の子要素を完全に上書きするには、新しいコンテンツを渡します。
// Replace children with wrapped version
React.cloneElement(child, {}, <strong>{child.props.children}</strong>)

複製前の要素型の確認

複製する前に、子要素が有効なReact要素であることを確認し、必要に応じて型も確認します。これにより、要素ではない子要素(テキスト、数値、null)を複製するのを防げます。
if (React.isValidElement(child)) {
  return React.cloneElement(child, extraProps);
}
return child;

cloneElementとContextの比較

cloneElementは子要素の構造を把握しておく必要があるため、壊れやすい方法です。複数の階層を通して暗黙的なデータを渡す場合は、一般的にContextが推奨されます。cloneElementは、親と直接の子要素の間でプロパティを注入する場合に限って使ってください。

現代的な代替手段: render propsとフック

これまでcloneElementが使われていた多くの場面では、カスタムフックやrender propのほうがすっきりします。親と直接の子要素の両方を自分で管理している場合に、本当に必要か検討したうえでcloneElementを使ってください。

確認問題

元の要素とReact.cloneElementに渡すpropsオブジェクトの両方に存在するプロパティは、どうなりますか?

復習

React.cloneElementは要素を複製し、新しいプロパティを注入します。コンパウンドコンポーネントで親から子へ暗黙的にプロパティを注入する場合に使います。階層が深い場合は、Contextやrender propsを優先してください。

コース完了

おめでとうございます!**React Children APIとスロットパターン**を完了しました。これで、柔軟なレイアウトコンポーネントを構築するためのprops.children、React.Childrenユーティリティ、名前付きスロットのプロパティ、cloneElementを習得しました。

よくある質問

「cloneElementでPropsを複製・注入する」レッスンは無料ですか?

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

「cloneElementでPropsを複製・注入する」で何を学びますか?

React.cloneElementを使って、親から子コンポーネントへ非表示のPropsを渡します ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「cloneElementでPropsを複製・注入する」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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