ReactでのDOM操作の実装

ReactでのDOM操作の実装

前の単語

場合によっては、通常のデータ フローの外部で子に対する変更を強制する必要があります。変更する子は、React コンポーネント インスタンスまたは DOM 要素にすることができます。現時点では、DOMを操作するためにrefが使用されています

使用シナリオ

ref が適している状況をいくつか示します。

1. フォーカス、テキスト選択、メディアコントロールを処理する

2. 強制アニメーションをトリガーする

3. サードパーティのDOMライブラリを統合する

宣言的に実行できる場合は、ref の使用を避けてください。

[注意] open() メソッドと close() メソッドを Dialog コンポーネントに直接公開しないでください。isOpen プロパティを渡す方が適切です。

参照

React は、任意のコンポーネントに特別な属性を追加することをサポートしています。 ref 属性は、コンポーネントがマウントまたはアンマウントされたときにすぐに実行されるコールバック関数を受け入れます。

[注意] コンポーネントがマウントされた後にrefを取得します。これはcomponentWillMountや最初のレンダリングでは取得できませんが、componentDidMountでは取得できます。

HTML要素

HTML 要素に ref 属性を追加すると、ref コールバックは基になる DOM 要素をパラメーターとして受け取ります。

React コンポーネントは、ロード時に DOM 要素を ref コールバック関数に渡し、アンロード時に null を渡します。 ref コールバックは、componentDidMount または componentDidUpdate ライフサイクル コールバックの前に実行されます。

クラスCustomTextInputはReact.Componentを拡張します。
  コンストラクタ(props) {
    スーパー(小道具);
    this.focus = this.focus.bind(this);
  }
  集中() {
    テキスト入力にフォーカスを当てます。
  }
  与える() {
    戻る (
      <div>
        <入力
          タイプ="テキスト"
          ref={(入力) => { this.textInput = input; }} />
        <入力
          タイプ = "ボタン"
          value="テキスト入力にフォーカスする"
          onClick={this.focus}
        />
      </div>
    );
  }
}

短く書くと次のようになります

ref={input => this.textInput = 入力}

クラスコンポーネント

クラスを使用して宣言されたカスタム コンポーネントに ref 属性を使用すると、ref コールバックは読み込まれた React インスタンスを受け取ります。

クラスAutoFocusTextInputはReact.Componentを拡張します{
  コンポーネントマウント() {
    テキスト入力にフォーカスを当てる
  }

  与える() {
    戻る (
      <カスタムテキスト入力
        ref={(入力) => { this.textInput = input; }} />
    );
  }
}

[注意] このメソッドはクラスで宣言されたCustomTextInputに対してのみ有効です

機能コンポーネント

関数コンポーネントにはインスタンスがないため、ref 属性は使用できません。

[DOMノードを親コンポーネントに公開する]

子ノードに特別な属性を公開します。子ノードは function 属性を取得し、それが DOM ノードに ref 属性として添付されます。これにより、親はミドルウェアを介して子のDOMノードに参照を渡すことができる。

この方法は、クラス コンポーネントと機能コンポーネントの両方に適用できます。

関数 CustomTextInput(props) {
  戻る (
    <div>
      <入力ref={props.inputRef} />
    </div>
  );
}

クラス Parent は React.Component を拡張します {
  与える() {
    戻る (
      <カスタムテキスト入力
        inputRef={el => this.inputElement = el}
      />
    );
  }
}

上記の例では、Parent は ref コールバックを特別な inputRef として CustomTextInput に渡し、CustomTextInput はそれを ref 属性を介して <input> に渡します。最後に、Parentのthis.inputElementは、CustomTextInputの<input>要素に対応するDOMノードに設定されます。

制御されていないコンポーネント

制御されていないコンポーネントを書くには、状態の更新ごとにイベントハンドラを書く代わりに、refを使用してDOMからフォームの値を取得できます。

[注意] reactをバインドせずにe.target.valueを介してDOM値を取得できます

クラスNameFormはReact.Componentを拡張します{
  コンストラクタ(props) {
    スーパー(小道具);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  ハンドル送信(イベント) {
    alert('名前が送信されました: ' + this.input.value);
    イベントをデフォルトにしない();
  }

  与える() {
    戻る (
      <フォームonSubmit={this.handleSubmit}>
        <ラベル>
          名前:
          <input type="text" ref={(input) => this.input = input} />
        </ラベル>
        <input type="submit" value="送信" />
      </フォーム>
    );
  }
}

非制御コンポーネントは実際のデータを DOM に保存するため、非制御コンポーネントを使用すると、React コードと非 React コードを同時に統合しやすくなります。

【デフォルト値】

React ライフサイクル中、フォーム要素の value 属性は DOM 内の値をオーバーライドします。制御されていないコンポーネントを使用する場合、通常は React で初期値を割り当てますが、それ以降の更新は制御しないようにします。この問題を解決するには、値の代わりに defaultValue 属性を指定します。

与える() {
  戻る (
    <フォームonSubmit={this.handleSubmit}>
      <ラベル>
        名前:
        <入力
          デフォルト値="ボブ"
          タイプ="テキスト"
          ref={(入力) => this.input = 入力} />
      </ラベル>
      <input type="submit" value="送信" />
    </フォーム>
  );
}

同様に、<input type="checkbox">と<input type="radio">はdefaultCheckedをサポートし、<select>と<textarea>はdefaultValueをサポートします。

リアクトDOM

react-dom パッケージは、アプリケーションのトップレベルのスコープから呼び出すことができる DOM のメソッドを提供し、必要に応じて React モデル外部の終了ポイントとして使用することもできます。しかし、ほとんどのコンポーネントはこのパッケージを使用する必要はありません

与える()
コンポーネントをアンマウントする()
DOMNode を見つける()

【与える()】

ReactDOM.render() は、
  要素、
  容器、
  [折り返し電話]
)

指定されたコンテナー内の DOM 要素に追加された React 要素をレンダリングし、コンポーネントへの参照 (ステートレス コンポーネントの場合は null) を返します。

React 要素が以前にコンテナーにレンダリングされている場合、このコードは更新を実行し、要素の最新の状態を反映するために必要な DOM 要素のみを変更します。

【コンポーネントノードのアンマウント()】

ReactDOM.unmountComponentAtNode(コンテナ)
マウントされた React コンポーネントを DOM 要素から削除し、そのイベント ハンドラーと状態をクリアします。コンテナにコンポーネントがマウントされていない場合、この関数は何も実行しません。 コンポーネントがアンインストールされている場合は true を返し、アンインストールできるコンポーネントがない場合は false を返します。

[DOMNode() を検索]

ReactDOM.findDOMNode(コンポーネント)
このコンポーネントが DOM にマウントされている場合、関数はブラウザで生成された対応する DOM 要素を返します。この関数は、フォームの値など、DOM から値を読み取ったり、DOM 要素のサイズを計算したりする必要がある場合に非常に便利です。 ほとんどの場合、DOM ノードへの参照を追加して、findDOMNode 関数の使用を完全に回避できます。レンダリングがnullまたはfalseを返す場合、findDOMNodeもnullを返します。

新しい参照

バージョン 16.3 より前の React では、ref を提供する方法が文字列とコールバックの 2 つありました。文字列メソッドにはいくつか問題があるため、公式の推奨では ref を使用するにはコールバックを使用します。今回導入されたcreateRef APIは、refを使用するための欠陥のない方法であると公式に言われており、コールバックメソッドも道を譲ることができる。

クラスMyComponentはReact.Componentを拡張します。
  コンストラクタ(props) {
    スーパー(小道具);
    this.myRef = React.createRef();
  }
  与える() {
    <div ref={this.myRef} /> を返します。
  }
}

次に、現在の属性を使用して現在の要素を取得します。

this.myRef.current

典型的なアプリケーションを以下に示します。

  コンストラクタ(props){
    スーパー(小道具)
    this.Mask = React.createRef()
    this.MenuList = React.createRef()
  }
  ハンドルクリック = () => {
    ReactDOM.findDOMNode(this.MenuList.current).classList.toggle('transform-zero')
    ReactDOM.findDOMNode(this.Mask.current).classList.toggle('mask-show')
  }

[注] styledComponentsでスタイル設定された要素によって公開されるインターフェースは、refではなくinnerRefです。

<ラップ innerRef={this.itemRef}>

これで、React での DOM 操作の実装に関するこの記事は終了です。React の DOM 操作に関するより詳しい情報は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Reactの仮想DOMとdiffアルゴリズムの詳細な説明
  • 仮想DOMの操作によるReact Viewレンダリングのシミュレーションの詳細な説明
  • Reactの最大のハイライトである仮想DOMについて簡単に説明します。
  • Reactで実際のDOMを操作して動的なボトム吸収を実現する例
  • React で指定された DOM ノードにコンポーネントをレンダリングする方法

<<:  Linuxで新しいユーザーを作成し、指定されたディレクトリへの権限を付与する

>>:  MySql はコミットする必要がありますか?

推薦する

MySQL 5.6 圧縮パッケージのインストール方法

MySQL には、msi インストールと zip 解凍の 2 つのインストール方法があります。 zi...

WeChatアプレット開発で遭遇したことのない落とし穴のまとめ

目次getApp()ページエントリファイルの先頭に変数を定義しますwx.createSelector...

Vue で @person 関数を実装する方法

この記事ではvueを使用し、マウスクリックイベントといくつかの小さなページの最適化を追加します。 基...

MySQLを安全にシャットダウンする方法

MySQL サーバーをシャットダウンする場合、シャットダウン方法に応じてさまざまな問題が発生する可能...

MySQL スロークエリログの有効化と設定

導入MySQL スロー クエリ ログは、問題のある SQL ステートメントのトラブルシューティングや...

Linux システムでの CPU 使用率が高い場合のトラブルシューティングのアイデアと解決策

序文Linux 運用保守エンジニアとして、日々の業務の中で Linux サーバーの CPU 負荷が ...

XHTML+CSS Web ページ作成における美しいスタイルシートの適用

これはかなり前に書かれた記事です。今となっては、その中の考え方は学ぶ価値があるように思えます。jb5...

MySQLデータベースの操作とメンテナンスのデータ復旧方法

これまでの 3 つの記事では、論理バックアップと物理バックアップを含む、MySQL データベースの一...

MySQL 10進数符号なし更新負数を0に変換

今日、インターフェースの同時実行の問題を検証したところ、これまでredisで解決していた同時実行のプ...

Linux でのインストール中にソフトウェア パッケージの依存関係レポートに関連する問題の解決策

目次背景1) yumのkeepchche機能を有効にする: 方法1 2) yum-utils ソフト...

フロントエンドタスク構築のための強力なツールであるGulp.jsの使い方を詳しく説明します

目次概要Gulp.jsをインストールするGulp.jsを使用してプロジェクトを作成するgulpfil...

ディレクトリスクロール効果を実現するネイティブJS

これはネイティブ JS で実装されたテキスト スクロール効果です。この効果は通常、ニュース、ダイナミ...

HTML で JavaScript を使用する

<script> タグHTML5では、スクリプトには次の属性があります: async、d...

WAMPにインストールするとMySQLが起動できるが、再起動後に起動できなくなる問題の解決方法

初めてwampをインストールした後、すべてのサービスが正常に使用できますが、再起動するとwampのア...

Linux スワップ パーティション (詳細説明)

目次リナックス1. SWAPとは2. swappiness は何を調節しますか? 3. スワップ操作...