どのHOCが他をラップします。複数のHOCでラップする順序は、反応するかどうかに関係しますか?複数のHOCを作成しましたwithSocket、withLoadingBarなど。深い醜い入れ子について心配する必要があります。コンポーネントのパフォーマンスに影響しますか?
複数のHOCでラップする順序は、反応するかどうかに関係しますか?
1つのHOCからその子コンポーネントに渡される小道具のため、HOCをラップする順序は重要です。次の例を考えてみましょう
const mapStateToProps(state, props) {
console.log(props.match);
return {
match: props.match
}
}
最初のケース:
withRouter(connect(mapStateToProps)(App));
この場合、withRouter
はconnect
をラップするため、withRouter ie history, match etc
によって提供される小道具はconnectで使用されるmapStateToProps
で使用可能になります。
次のようなHOCを考えてください
const MyComponent = connect(mapStateToProps)(App);
export default withRouter(MyComponent);
ここで、withRouter
は次のように実装できます。
const withRouter = (Comp) => {
return class Something extends React.Component {
render() {
return <Comp match={this.context.router.match} />
}
}
..
}
したがって、この場合、Comp
、つまりMyComponent
でラップされたwithRouter
は、一致小道具を受け取ります。上記の場合、これはconnect
でラップされているコンポーネントです。
2番目のケース:
connect(mapStateToProps)(withRouter(App));
この場合、接続はwithRouterをラップするため、withRouter
、つまりhistory, match etc
によって提供される小道具は、mapStateToProps
によって使用されるconnect
では使用できません。親から提供されていません。
深く醜い入れ子を心配する必要がありますか?
あるHOCが提供する小道具が別のHOCによって使用されている場合にのみ、心配する必要があります。基本コンポーネント内でHOCから渡された小道具を直接使用する場合は、順序について心配する必要はありません。
コンポーネントのパフォーマンスに影響を与えますか?
HOCを使用する順序は、コンポーネントのパフォーマンスに影響しません
例については、以下のコードサンドボックスを確認してください
Reactは構成がすべてであり、ほとんどの場合、パフォーマンスの問題になることはありません。実際にパフォーマンスの問題を認識するまでは、心配しないでください。 HOCのネストも問題ありません。考慮する必要があるのは、HOCの1つが別のHOCによって注入された小道具を消費する場合だけです。これは例えばmapStateToProps
でオブジェクトを選択するためにid
に_react-router
_ urlパラメータが必要な場合。次に、最初にconnect()
HOCを適用し、次にwithRouter()
HOCを適用して、ラップされたコンポーネントのmatch
内のownProps
オブジェクトにアクセスする必要があります。