React: componentDidUpdateでDOMを操作する

作成日 2016年09月23日  ·  3コメント  ·  ソース: facebook/react

こんにちは、これは質問のようなものです。 componentDidUpdate DOM操作に関するディスカッションを開きたいと思います。

Reactプラグインを作成しています。 CSSは、このプラグインが実行する必要のあるすべてをカバーするほど強力ではないため、いくつかのDOM計算を実行する必要があります。 問題は、同じコンポーネントによってレンダリングされた他のDOM要素のgetBoundingClientRect()の戻り値に応じて、いくつかのCSSプロパティを調整する必要があることです

したがって、技術的には3つのオプションがあります。

1)計算getBoundingClientRectcomponentDidUpdateと呼び出すsetState計算値と。 特定の場合に発生する可能性のある無限ループが怖いので、これには行きません。

2)1)のようにして、 shouldComponentUpdateで少し遊んでください。ただし、これは非常に複雑で読みにくいようです。 特定のユースケースに応じて、多くの質問がポップアップ表示されます。

3)componentDidUpdateからDOMを更新します。 これは私が選択したソリューションであり、機能し、シンプルで安定しており、意図したとおりに機能します。 しかし、私は限界に達していると感じているので、これが問題のない方法であることを再確認したいと思いました。 componentDidUpdate DOMを操作しても大丈夫ですか? renderが実行されるたびに呼び出され、次のrender DOMを再度変更するため、変更を破棄しても問題ありません。

これがコードの一部です

componentDidMount() {
  this.recalculateIndent();
}

componentDidUpdate() {
  this.recalculateIndent();
}

recalculateIndent() {
  // calculate indent based on getBoundingClientRect of some DOM reference
  this.textareaRef.style.textIndent = `${indent}px`;
}

render() {
   return (
   ...
   <textarea ref={ref => this.textareaRef = ref}/>
   ...
   );
}

最も参考になるコメント

componentDidUpdateを使用する@jvorcakは、レンダリング後にDOMを手動で操作するための正しい場所です。 ドキュメントによると:

これは、コンポーネントが更新されたときにDOMを操作する機会として使用してください。

また、問題追跡システムは、機能のリクエストとバグレポートにのみ使用するようにしています。 使用法に関する質問は、 discuss.reactjs.orgやStackOverflowなどの別の場所に送信する必要があります。 ありがとう!

全てのコメント3件

各ソリューション(コンポーネントライフサイクルメソッド)は具体的な状況に適していますが、DOM操作は間違っています。 状態を使用してコンポーネントを再レンダリングします。 私の最後のユースケース「テーブルの固定ヘッダー+テーブル本体の仮想スクロール」の例です。これが正しいフローを理解するのに役立つことを願っています。

  1. コンポーネントコンストラクター:初期状態値:bodyHeight = 0(または必要に応じてnull)。
  2. 最初にレンダリングし、テーブルヘッダーをレンダリングしますが、テーブル本体は空です(0行)。
  3. componentDidMount-ヘッダーとコンテナーのDOMの高さ(+計算...)とbodyHeightのsetState(再レンダリング)を読み取ります。
  4. 2番目のレンダリングbodyHeight!== 0、テーブル本体がレンダリングされます。 これで、高さパラメーターがわかりました( DOM操作ではなく、「スタイル」コンポーネントの小道具を使用して設定できます)。行のコンポーネントを追加できます。
  5. 「サイズ変更」(ドキュメント/ブラウザのサイズ変更)用の追加のイベントリスナー、componentDidMountに追加、componentWillUnmountに削除。 イベントハンドラーでは、componentDidMountと同じことを行います-新しいDOMの高さの値とsetStateを読み取ります。
  6. 手作業によるDOM操作はなく、reactがその役割を果たします。

componentDidUpdateを使用する@jvorcakは、レンダリング後にDOMを手動で操作するための正しい場所です。 ドキュメントによると:

これは、コンポーネントが更新されたときにDOMを操作する機会として使用してください。

また、問題追跡システムは、機能のリクエストとバグレポートにのみ使用するようにしています。 使用法に関する質問は、 discuss.reactjs.orgやStackOverflowなどの別の場所に送信する必要があります。 ありがとう!

別のコンポーネントを変更した後に1つのコンポーネントを更新したい場合はどうなりますか?

このページは役に立ちましたか?
0 / 5 - 0 評価