React で ReactDOM.createPortal() を使用する

Oluwafisayo Oluwatayo 2023年6月21日
  1. React で ReactDOM.createPortal() を使用して数値生成アプリを作成する
  2. React で ReactDOM.createPortal() を使用して CSS オーバーレイ効果を作成する
  3. まとめ
React で ReactDOM.createPortal() を使用する

React とは、クリーンでわかりやすいコードを書くための最善の方法を考案することです。 React の createPortal() 関数はそのような方法の 1つです。

ReactDOM.createPortal() 関数は、長いコード行をセクションに分割する便利な方法です。 子コンポーネントを親コンポーネントから分離して各コンポーネントを簡潔にする場合、createPortal() 関数は有効性を失うことなく両方のコンポーネントを接続します。

また、親コンポーネントの前に子コンポーネントのコンテンツをレンダリングする場合は、ReactDOM.createPortal() を使用できます。 とはいえ、単純なアプリを作成してこの機能を使用する方法を見てみましょう。

React で ReactDOM.createPortal() を使用して数値生成アプリを作成する

この例では、子コンポーネントから親コンポーネントの状態を制御する方法を確認しますが、子コンポーネントは onClick イベント ハンドラーを使用して直接 div 内にあるわけではありません。

新しいプロジェクト フォルダーを作成し、パブリック フォルダーに移動し、index.html ファイルにアクセスして、子コンポーネントがレンダリングされる DOM として機能する div を作成します。 したがって、index.html は次のようになります。

コード スニペット - indx.html:

<div id="app-container"></div>
<div id="modal-container"></div>

次に、実際のコーディングを行うために index.js ファイルに進みます。 ここでは、react-dom から createPortal() 関数をインポートします。

コード スニペット - index.js:

import React from 'react';
import ReactDOM, { render, createPortal } from 'react-dom';

const appContainer = document.getElementById('app-container');
const modalContainer = document.getElementById('modal-container');

class Parent extends React.Component {
  state = {clicks: 0};
  onClick = () => {

    this.setState(state => ({clicks: state.clicks + 1}));
  };
  render() {
    return (
      <div onClick={this.onClick}>
        <p>Number of clicks: {this.state.clicks}</p>

        {ReactDOM.createPortal(<Child />, modalContainer)}
      </div>
    );
  }
}

function Child() {
  return <button>Click</button>;
}
ReactDOM.render(<Parent />, appContainer);

出力:

ReactDOM.createPortal を使用した数値生成アプリ

Click ボタンは、ボタンがクリックされたときに実行されるアクションを定義するコンポーネント内にはありませんが、ボタンが親コンポーネントを更新していることがわかります。

React で ReactDOM.createPortal() を使用して CSS オーバーレイ効果を作成する

createPortal() 関数を使用すると、ボタンのアクションを定義する機能コンポーネント内にスタイリングが含まれていない場合でも、ボタンがクリックされると Web ページをカバーする .js ファイルにスタイリング コンポーネントを作成できます。 .

src フォルダー内に新しいファイルを作成し、overlayStyles.js という名前を付けます。 これには、ボタンがクリックされたときに Web ページ上にレンダリングされるオーバーレイ CSS スタイルが含まれます。

次に、index.js ファイルに移動して、次のコードを挿入します。

コード スニペット - index.js:

import React from "react";
import ReactDOM, { render } from "react-dom";
import { overlay, overlayContent } from "./overlayStyles";

class Overlay extends React.Component {
  constructor(props) {
    super(props);
    this.overlayContainer = document.createElement("div");
    document.body.appendChild(this.overlayContainer);
  }

  componentWillUnmount() {
    document.body.removeChild(this.overlayContainer);
  }

  render() {
    return ReactDOM.createPortal(
      <div style={overlay}>
        <div style={overlayContent}>{this.props.children}</div>
      </div>,
      this.overlayContainer
    );
  }
}

class App extends React.Component {
  state = {
    showOverlay: false
  };

  toggleOverlay = () => {
    this.setState(prevState => {
      return { showOverlay: !prevState.showOverlay };
    });
  };

  render() {
    return (
      <div>
        <h1>Dashboard</h1>
        {this.state.showOverlay && (
          <Overlay>
            <div>
              Overlay Content{" "}
              <button onClick={this.toggleOverlay}>Close</button>
            </div>
          </Overlay>
        )}
        <button onClick={this.toggleOverlay}>Open Overlay</button>
      </div>
    );
  }
}

render(<App />, document.getElementById("root"));

次に、overlayStyles.js ファイルに、次のような CSS コードを追加します。

コード スニペット - overlayStyles.js:

export const overlay = {
  height: "100%",
  width: "100%",
  position: "fixed",
  StayInPlaceZIndex: "1",
  SitOnTopLeft: "0",
  top: "0",
  backgroundColor: "rgb(0,0,0)",
  BlackFallbackColorBackgroundColor: "rgba(0,0,0, 0.9)",
  BlackWOpacityOverflowX: "hidden",
  DisableHorizontalScrollTransition: "0.5s"
};

export const overlayContent = {
  position: "relative",
  top: "25%",
  width: "100%",
  textAlign: "center",
  marginTop: "30px",
  color: "white"
};

出力:

ReactDOM.createPortal を使用した CSS オーバーレイ効果

Open Overlay ボタンをクリックすると、onClick イベントを処理するコンポーネント内にない場合でも、スタイリングがアクティブになることがわかります。

まとめ

ReactDOM.createPortal() 関数を使用すると、コーダーは、カーソルを合わせたときに項目をプレビューしたい場合など、アプリケーション内の特定の機能に使用するコンポーネントを簡単に分離できます。

Oluwafisayo Oluwatayo avatar Oluwafisayo Oluwatayo avatar

Fisayo is a tech expert and enthusiast who loves to solve problems, seek new challenges and aim to spread the knowledge of what she has learned across the globe.

LinkedIn