0Pricing
React Academy · レッスン

React Portalsとは?

createPortal APIと、root divの外部にレンダリングする利点を理解します

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

ようこそ

このレッスンでは、React Portalとは何か、親のDOMツリーの外側にレンダリングすることがなぜ便利なのか、そしてcreatePortal APIの使い方を学びます。

通常のReact DOM階層

デフォルトでは、すべてのコンポーネントが親のDOMノード内にレンダリングされます。通常、Reactアプリ全体は1つの`
`の中に配置されます。これは、`overflow: hidden`を持つ親からモーダル、ツールチップ、ドロップダウンを外へ出す必要が生じるまでは問題ありません。

Portalとは

**Portal**を使うと、コンポーネントの出力を別のDOMノード、つまりReactのルートの外側に存在するDOMノードへレンダリングできます。コンポーネントのReactツリーは変わらず、DOM上の位置だけが変わります。
import { createPortal } from 'react-dom';

function Modal({ children }) {
  return createPortal(
    children,
    document.body // render into body, not parent
  );
}

Portalが必要な理由

`overflow: hidden`、`z-index`のスタッキングコンテキスト、親要素の`transform`などのCSSプロパティによって、子要素が切り取られたり隠れたりすることがあります。Portalは、レンダリング結果を別のDOMノードに配置することで、これらの制約を回避します。

イベントのバブリングは引き続き機能する

PortalのDOMノードが親の外側にあっても、**ReactのイベントはDOMツリーではなくReactコンポーネントツリーを通じてバブリングします**。Portal内のモーダルをクリックすると、そのイベントはReact上の親までバブリングします。

Portalの描画先を作成する

既存の任意のDOMノードへPortalを作成できます。よく使われる方法は、`index.html`に専用の`
// index.html
<body>
  <div id="root"></div>
  <div id="modal-root"></div>
</body>

// Modal.jsx
createPortal(children, document.getElementById('modal-root'));

PortalのライフサイクルはReactの親に紐づく

Portalは親コンポーネントのマウント時にマウントされ、親のアンマウント時にアンマウントされます。ReactはPortalを同じコンポーネントツリーの一部として追跡するため、コンテキストとrefは通常どおり機能します。

Portalをまたいでもコンテキストは機能する

PortalはReactコンポーネントツリーの一部であり続けるため、Portalの上位で提供されたコンテキストの値をPortal内でも利用できます。DOM上の位置は、Reactのコンテキストチェーンに影響しません。

stateとcreatePortalを使う

state変数でPortalの表示状態を制御してください。ボタンで切り替えると、ボタンが通常のDOM上の位置にあるまま、Portalのコンテンツがdocument.bodyに表示されます。
function App() {
  const [open, setOpen] = useState(false);
  return (
    <div>
      <button onClick={() => setOpen(true)}>Open</button>
      {open && createPortal(
        <div className="overlay">
          <button onClick={() => setOpen(false)}>Close</button>
        </div>,
        document.body
      )}
    </div>
  );
}

サーバーサイドレンダリングとPortal

PortalにはDOMノードが必要なため、常にクライアント側で動作します。Next.jsなどのSSR環境では、`useEffect`またはマウント済みかどうかのstateチェックを使い、Portalのレンダリングコードがブラウザーでのみ実行されるようにしてください。

確認問題

React Portalは別のDOMノードにコンテンツをレンダリングします。これによってReactコンポーネントツリーのどの部分が影響を受けますか?

まとめ

Portalを使うと、createPortal()によって任意のDOMノードへReactの出力をレンダリングできます。Reactツリー、コンテキスト、イベントのバブリングには影響がありません。モーダルやツールチップで、overflowやz-indexの制約を回避するために使用してください。

次のレッスン

次のレッスン: **Portalを使ったモーダルコンポーネントの構築** — open/closeのstate管理を行い、document.bodyにPortalする完全に再利用可能なモーダルを構築します。

よくある質問

「React Portalsとは?」レッスンは無料ですか?

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

「React Portalsとは?」で何を学びますか?

createPortal APIと、root divの外部にレンダリングする利点を理解します ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「React Portalsとは?」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. React Portalsとは?
  2. Portalsでモーダルコンポーネントを構築する
  3. モーダルのフォーカスとキーボードトラップを扱う
  4. Portalsでツールチップとドロップダウンメニューを作る
← React Academyに戻る