2017-10-11 20 views
0

コンポーネントが完全にレンダリングされた後、特定の要素の正確な位置を取得するには、getBoundingClientRect()を使用する必要があります。一度コンポーネントがレンダリングされるライフサイクルメソッド

これにはどのライフサイクルメソッドを使用する必要がありますか?私はレンダリングが完了した後にcomponentDidMount()が呼び出されたとは思わない。

もっと分かりやすくするために、私が達成しようとしているのは次のとおりです。 私のコンポーネントはDIV要素のリストをレンダリングします。 30〜40人もの人がいる可能性があります。それらがレンダリングされると、特定の要素に自動的にスクロールしたいと思います。この要素は、レンダリングされたセクションの下部、中央、またはどこにでも配置できます。私はそれぞれのDIV要素をIDにするので、getBoundingClientReact()にその場所を知らせるのは簡単です。そのデータを取得したら、その場所にスクロールします。

UPDATE:

これは私のコードは次のようになります。

componentDidUpdate(prevProps, prevState) { 

    // Get the ID of the element I need to scroll to 
    const id = "divId-" + prevProps.myId; 

    // Find the rendered element 
    const element = document.getElementById(id); 

    // Get coordinates 
    const position = element.getBoundingClientRect(); 

    // Call scrollTo custom function to scroll to the element 
    scrollTo(position.top); 

    // Set the new location 
    this.props.actions.setLocation(position.top); 
} 
+0

はい、 'setLocation'は基本的にReduxストアの新しい場所を設定します。一度私がそれを把握したら新しい場所を設定するための最良の方法は何ですか?基本的には、私はコードの一部として 'componentDidUpdate()'の新しい場所を探し出します。 – Sam

+0

>ここでthis.setState()を呼び出すことはできません。 componentWillUpdateが返る前にReactコンポーネントの更新をトリガーする何か他の操作(例えばreduxアクションのディスパッチ)もしないでください。小道具の変更に対応して状態を更新する必要がある場合は、componentWillReceiveProps()を使用します。 – HyeonJunOh

+0

私はこれがあなたを助けてくれることを願っています。 – HyeonJunOh

答えて

0

componentWillUpdate(prevProps, prevState)

componentWillUpdateは()新しい 小道具や状態が受信されているとき、レンダリングの直前に呼び出されます。これを更新の前に準備を行う の機会として使用してください。このメソッドは、初期レンダリングでは とは呼ばれません。

または componentDidUpdate(prevProps, prevState)

コンポーネント が更新されたとき、DOMを操作する機会としてこれを使用してください。これは、現在の小道具を以前の小道具と比較する限り、ネットワークリクエストを として実行するのに適しています(小道具が変更されていない場合は、 ネットワークリクエストは不要です)。

が役立ちます。 hereで詳細を確認できます。

+0

私は両方を試して、「最大呼び出しスタックサイズを超えました」というエラーが表示されます。何らかの理由で、ループに入っているようです。 – Sam

+0

@ Sam私は無限の再帰的なループまたはそれのようなものがあると思います。エラーを起こすコードを書き留めてください。 – HyeonJunOh

+0

'this.props.actions.setLocation'関数に' setState() 'が含まれていて、無限ループになります。なぜなら、 'componentWillUpdate()'と 'componentDidUpdate()'はすべてのコンポーネントの 'setState()'の前後で実行されるからです。 – HyeonJunOh

関連する問題