Reactでコンポーネントを再レンダリングする原因をデバッグする体系的なアプローチはありますか?私はシンプルなconsole.log()を使用してレンダリングの時間を確認していますが、コンポーネントが何回(4回)レンダーされているのかわかりません。タイムラインやすべてのコンポーネントツリーのレンダリングとオーダーを示すツールが存在しますか?Reactコンポーネントが再レンダリングされている理由を追跡する
答えて
@jpdelatorreさんの回答が正しいです。 Reactの強みの1つは、一般的に、コードを見てチェーンをバックアップするデータフローを簡単にトレースできるということです。 React DevTools extensionがそれを助けることができます。
また、私はuseful tools for visualizing/tracking React component re-renderingのリストを私のRedux addons catalogの一部として持っていて、React performance monitoringのいくつかの記事は私のReact/Redux links listにあります。
Reactコンポーネントが再レンダリングするいくつかのインスタンスがあります。コンポーネント内this.setState()
を呼び出す
- 親コンポーネント。これにより、以下のコンポーネントのライフサイクルメソッドが起動されます
shouldComponentUpdate
componentWillUpdate
>render
>componentDidUpdate
- コンポーネントの変更
props
が変更されます。これはthis.setState
に類似しているあなたは、あなたのコンポーネントのを最小限に抑えることができthis.forceUpdate
を呼び出すcomponentWillReceiveProps
>shouldComponentUpdate
>componentWillUpdate
>render
>componentDidUpdate
(Reduxのストアに該当する変更があるreact-redux
トリガーのconnect
方法この)
shouldComponentUpdate
の中に小切手を入れて、返す必要がない場合はfalse
を返してください。 別の方法は、React.PureComponent
またはステートレスコンポーネントを使用することです。純粋でステートレスなコンポーネントは、その小道具に変更があった場合にのみ再レンダリングされます。
Nitpick:「ステートレス」とは、クラス構文で定義されているかどうかにかかわらず、状態を使用しないコンポーネントを意味します。機能的な構文。また、機能コンポーネントは常に再レンダリングされます。あなたは 'shouldComponentUpdate'を使うか、' React.PureComponent'を拡張するだけで、変更時に再レンダリングするだけです。 – markerikson
ステートレス/機能コンポーネントは常に再レンダリングされています。私の答えが更新されます。 – jpdelatorre
機能コンポーネントが常に再レンダリングする時期と理由を明確にすることができますか?私はアプリでかなりの機能コンポーネントを使用しています。 – jasan
@ jpdelatorreの答えは、Reactコンポーネントが再レンダリングする一般的な理由を強調するのに最適です。
ちょうど1つのインスタンスに少し深めたいと思っただけです:小道具を変更するとき。 Reactコンポーネントの再レンダリングを引き起こしている問題のトラブルシューティングはよくある問題です。私の経験では多くの時間がこの問題を追跡するには、どの小道具が変更されているかを判断する必要があります。
リアクションコンポーネントは、新しいプロップを受信するたびに再レンダリングされます。彼らは次のように新しい小道具を受け取ることができます。
<MyComponent prop1={currentPosition} prop2={myVariable} />
またはMyComponent
場合Reduxのストアに接続されている:prop1
の値、prop2
、prop3
、またはprop4
が再ますMyComponent
を変更
function mapStateToProps (state) {
return {
prop3: state.data.get('savedName'),
prop4: state.data.get('userCount')
}
}
いつでもレンダリングする。4つの小道具では、console.log(this.props)
をrender
ブロックの先頭に置くことで、どの小道具が変更されているかを追跡するのが難しくありません。しかし、より複雑なコンポーネントやますます多くの小道具では、この方法は容認できません。ここで
は変更が再レンダリングするコンポーネントを引き起こしている小道具を判断する(便宜上lodashを使用して)有用なアプローチである:
componentWillReceiveProps (nextProps) {
const changedProps = _.reduce(this.props, function (result, value, key) {
return _.isEqual(value, nextProps[key])
? result
: result.concat(key)
}, [])
console.log('changedProps: ', changedProps)
}
あなたのコンポーネントにこのスニペットを追加する疑わしい再引き起こして犯人を明らかにすることができます多くの場合、不要なデータがコンポーネントにパイプされるのを助けます。
- 1. React/Reduxコンポーネントが再レンダリングされない
- 2. 私のコンポーネントが反応で再レンダリングされない理由
- 3. ReactVarは再レンダリングされないReactコンポーネント
- 4. 小道具が等しい場合にコンポーネントが再レンダリングされる理由
- 5. react-redux performanceコンポーネントを再レンダリングする
- 6. React/Reduxコンポーネントが状態変更時に再レンダリングされない
- 7. My Reactコンポーネントがレンダリングされない
- 8. Reactコンポーネントでコンテンツがレンダリングされない
- 9. React/Reduxコンポーネントの再レンダリング
- 10. React + Redux:グローバル状態がコンポーネントに供給されない理由
- 11. Reactコンポーネントがレンダリングされているかどうかのテスト
- 12. React/Mobx - コンポーネントが再レンダリングされていますが、componentWillReceiveProps()が呼び出されていません
- 13. 追加Reactネイティブコンポーネントが再レンダリングされない
- 14. Reactアプリでレンダリングを追跡していますか?
- 15. propsが変更されたときにreactがコンポーネントを再レンダリングしない
- 16. Reactコンポーネントを再レンダリングする正しい方法は?
- 17. React-Native - ポップアクションが実行されたときにデータを再読み込みしてコンポーネントを再レンダリングする
- 18. コンポーネントを手動でコンポーネントに渡すときにコンポーネントが再レンダリングされない(react-redux)
- 19. React Router - Pathコンポーネントがレンダリングされていません
- 20. 子Reactコンポーネントは再レンダリングされません
- 21. ReactコンポーネントはonClickイベント後に再レンダリングされません
- 22. 再レンダリング時にコンポーネントがクラッシュする| React、Redux
- 23. React:コンポーネントがレンダリングされたときにのみコンポーネントのCSSをロードする
- 24. React/Reduxコンポーネントはレンダリングされません
- 25. コンポーネントの再レンダリングを停止する方法(React-redux)
- 26. IDが再シードされない理由
- 27. react-native:コンポーネントが.mapでレンダリングされない
- 28. React Router v4でコンポーネントがレンダリングされない
- 29. React:子コンポーネントが正しくレンダリングされない
- 30. React/Jest - Jestユニットテストで接続されたHOCコンポーネントをレンダリングする
'shouldComponentUpdate'を使ってコンポーネントの自動更新を無効にし、そこからトレースを開始できますか?詳細はこちらをご覧ください:https://facebook.github.io/react/docs/optimizing-performance.html –