2017-04-16 4 views
5

私はいくつかのDOMノードのサイズの計算(レンダリングされたDOMノードの上部、下部、およびサイズプロパティ)を作りたい状況によrefまたはfindDOMNodeを使用して要素のルートDOMノードを取得する必要がありますか?

私はcomponentDidUpdate方法で、今やっていることにあります

componentDidUpdate() { 
     var node = ReactDOM.findDOMNode(this); 

     this.elementBox = node.getBoundingClientRect(); 
     this.elementHeight = node.clientHeight; 
     // Make calculations and stuff 
} 

これは問題なく動作していますが、私は少し気になり、ベストプラクティスに反応します。 findDOMNodeの代わりにrefプロパティを使用することについていくつかの話がありますが、それらのすべてが子DOM要素用です。私の場合、私のコンポーネントのルートDOMノードのみが必要です。ただ、それは参照が私に正しい感じていないのです得るために、私のルートDOMノードへのREFコールバックを取り付け、正直に言うと

render(){ 
    return (
      <section // container 
       ref={(n) => this.node = n}> 
       // Stuff 
      </section> 
} 
componentDidUpdate() { 

     this.elementBox = this.node.getBoundingClientRect(); 
     this.elementHeight = this.node.clientHeight; 
     // Make calculations and stuff 
} 

REFを使用して代替は次のようになります。

この場合のベストプラクティスとは何でしょうか?どれがパフォーマンスが良いですか?

答えて

1

私が文書(https://facebook.github.io/react/docs/react-dom.html#finddomnode)を参照した場合、findDOMNodeは実際のオプションよりもトリックであるようです。レファレンスは最良の選択肢だと思われる。 docは、ここで指定したのと同じ草案(ref={(n) => this.node = n})を実装しています。

+1

私が見つけたドキュメントをもう一度読みます:>クラスのプロパティを設定するためにrefコールバックを使用するのは、DOM要素にアクセスする共通のパターンです。好ましい方法は、上の例のようにrefコールバックでプロパティを設定することです。 – Danielo515

+0

ところで、あなたが気づいたかどうかはわかりませんが、JS Standardは '{(n)=> this.node = n} 'について" Arrow関数は代入を返すべきではありません "と言っています。私はそれが正当な苦情であるかどうか疑問に思います – revelt

関連する問題