哪个HOC将包装另一个。包含多个HOC的顺序是否有反应?我创建了多个HOCs withSocket , withLoadingBar 等等。我应该担心深度丑陋的嵌套,它会对组件的性能产生影响吗?
答案 0 :(得分:11)
多个HOC的包装顺序是否有反应?
由于从一个HOC传递到其子组件的props,因此包装HOC的顺序很重要。请考虑以下示例
const mapStateToProps(state, props) {
console.log(props.match);
return {
match: props.match
}
}
第一种情况:
withRouter(connect(mapStateToProps)(App));
在这种情况下,由于withRouter
包裹了connect
,因此withRouter ie history, match etc
提供的道具将在连接使用的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
ie withRouter
会收到匹配道具,在上面的例子中是{{1}包裹的组件}
第二种情况:
connect
在这种情况下,由于connect包装了withRouter,connect(mapStateToProps)(withRouter(App));
提供的道具即withRouter
将不会在history, match etc
{/ 1}}中使用如果它们不是由父母提供的。
我应该担心深陷难看的巢穴吗?
如果一个HOC提供的道具被另一个人使用,你应该只担心它。假如你在基础组件内直接使用来自HOC的传递道具,你不必担心订单
它会对组件的性能产生影响吗?
使用HOC的顺序不会影响组件性能
检查以下代码框以获取示例
答案 1 :(得分:0)
React是关于组合的,在大多数情况下,它根本不应该是性能问题。在您真正意识到性能问题之前不要担心。嵌套HOC也没关系。你唯一需要考虑的是当其中一个HOC消耗道具由另一个HOC注入时。这是例如如果react-router
中需要mapStateToProps
url params来id
选择对象,则需要这种情况。然后,您需要首先应用connect()
HOC,然后才应用withRouter()
HOC来访问包装组件的match
中的ownProps
对象。