0Pricing
React Academy · レッスン

Render Propsパターン

JSXを返す関数をpropとして渡し、UIを密結合にせずに振る舞いを共有します。

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

ようこそ

このレッスンでは、関数をpropとして渡し、その関数がJSXを返すrender propsパターンを理解し、コンポーネント間で振る舞いを共有する際にいつ役立つのかを学びます。

Render Propsとは

Render propsは、関数であるpropをコンポーネントが受け取るパターンです。コンポーネントはこの関数を呼び出して、レンダリングする出力を生成します。UIは利用側が制御し、コンポーネントは振る舞いを提供します。
<DataProvider render={data => <UserCard user={data} />} />

シンプルなRender Propの例

Toggleコンポーネントは開閉状態を管理し、現在の状態と切り替え関数をrender propに渡して呼び出します。どのようにレンダリングするかは利用側が決めます。
function Toggle({ render }) {
  const [on, setOn] = useState(false);
  return render(on, () => setOn(!on));
}

<Toggle render={(on, toggle) => (
  <button onClick={toggle}>{on ? 'Close' : 'Open'}</button>
)} />

childrenをRender Propとして使う

名前付きのrender propの代わりに、関数として`children`を使うこともできます。多くのライブラリ(React Router v5やFormik)がこのパターンを使っており、「children as a function」と呼ばれることもあります。
<Toggle>
  {(on, toggle) => (
    <div>
      {on && <Panel />}
      <button onClick={toggle}>Toggle</button>
    </div>
  )}
</Toggle>

マウス位置のトラッキング

これはrender propsの典型的な例です。MouseTrackerコンポーネントがカーソルの位置を追跡し、それをrender propに渡します。利用側はどのような方法でも位置を表示できます。
function MouseTracker({ children }) {
  const [pos, setPos] = useState({ x: 0, y: 0 });
  return (
    <div onMouseMove={e => setPos({ x: e.clientX, y: e.clientY })}>
      {children(pos)}
    </div>
  );
}

Render Propsとカスタムフックの比較

Render propsは、フックが登場する前に主流だったパターンです。現在はカスタムフックを使うと、よりすっきりと同じことを実現できます。フックがデータと関数を返し、コンポーネントがそれらを独自のJSXで使います。現代のReactではフックが推奨されます。
// Old: render props
<Mouse render={pos => <p>{pos.x}</p>} />

// Modern: custom hook
const pos = useMouse();
<p>{pos.x}</p>

Render Propsが今でも適している場合

Render propsは、次のような場合に今でも役立ちます。(1) ツリー内の特定の場所に動的なレンダリングを注入する必要がある場合、(2) ロジックとUIを分離するヘッドレスコンポーネントライブラリを構築する場合です。

パフォーマンスに関する注意

render propをインラインで定義すると、親がレンダリングされるたびに新しい関数が作成されるため、PureComponentやReact.memoの子コンポーネントが再レンダリングをスキップできなくなります。render propの関数は、安定した変数またはメソッドに切り出してください。
// Avoid: new function every render
<Toggle render={pos => <Dot pos={pos} />} />

// Better: stable reference
const renderDot = pos => <Dot pos={pos} />;
<Toggle render={renderDot} />

Render Propsの合成

複数のrender-propコンポーネントをネストすると、すぐに「render prop hell」や「wrapper hell」と呼ばれる状態になります。読みづらいコールバックが深くネストされるためです。これがフックが導入された理由の一つです。

ライブラリでのRender Props

React Router v5では、Routeにrender propsが使われていました。Downshift、Formik、React-Tableもその派生形を使っています。render propsを理解しておくと、これらのライブラリを使ったコードの読み解きやデバッグに役立ちます。

クイックチェック

静的なJSXを渡す場合と比べて、render propsパターンの主な利点は何ですか?

まとめ

Render propsでは、JSXを返す関数を渡します。コンポーネントが振る舞いを提供し、利用側がUIを提供します。現代のReactではカスタムフックを優先しますが、既存コードの読解やヘッドレスコンポーネントの構築のために、render propsも理解しておきましょう。

次のレッスン

次のレッスン:**高階コンポーネント(HOC)を理解する** — コンポーネントをラップして、propの注入、ルートの保護、ロギングを行う方法を学びます。

よくある質問

「Render Propsパターン」レッスンは無料ですか?

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

「Render Propsパターン」で何を学びますか?

JSXを返す関数をpropとして渡し、UIを密結合にせずに振る舞いを共有します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「Render Propsパターン」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. Render Propsパターン
  2. Higher-Order Components(HOC)の基礎
  3. HOC・Render Props・Custom Hooksの比較
  4. HOCからCustom Hookへのリファクタリング
← React Academyに戻る