Material UI v4迁移自v3:withTheme与Redux compose兼容问题
解决Redux compose结合Material UI HOC的报错问题
嘿,这个问题我之前也碰到过,其实就是几个小细节没注意到,咱们一步步来解决:
错误原因拆解
你遇到的报错本质是三个核心问题:
withTheme()的调用方式错了:Material UI的withTheme是一个高阶组件(HOC),它需要直接接收组件作为参数。你写成withTheme()相当于提前执行了这个函数,但此时没有传入组件,自然会报“undefined component”的错误——应该直接传withTheme(不带括号)。- compose的顺序搞反了:Redux的
compose是从右到左执行HOC的,也就是说参数列表最右边的HOC会先包裹你的组件,然后依次往左执行。你原来的顺序刚好和实际需要的嵌套顺序相反。 connect的使用不规范:connect本身是一个工厂函数,需要先调用(哪怕你不需要映射状态或方法,也要写成connect())才能返回真正的HOC,直接传connect是无效的。
正确的compose写法
假设你有对应的mapStateToProps和mapDispatchToProps,代码应该写成这样:
// 先定义状态和方法映射(如果需要的话) const mapStateToProps = state => ({ // 你的状态映射逻辑 }); const mapDispatchToProps = dispatch => ({ // 你的方法映射逻辑 }); // 正确的compose组合方式 export default compose( connect(mapStateToProps, mapDispatchToProps), // 最外层的HOC,最后执行 withTheme, // 中间层,不需要加括号 withStyles(styles) // 最内层的HOC,先包裹SearchWrapper )(SearchWrapper);
如果不需要状态或方法映射,简化成这样就行:
export default compose( connect(), withTheme, withStyles(styles) )(SearchWrapper);
为什么这样能行?
这个写法和你手动嵌套的connect(mapStateToProps)(withTheme(withStyles(styles)(SearchWrapper)))完全等价:
compose会从右到左执行,先让withStyles(styles)包裹SearchWrapper,- 然后把结果传给
withTheme, - 最后再用
connect(...)包裹最终的组件,完美匹配你需要的层级关系。
内容的提问来源于stack exchange,提问作者EugenSunic
相关产品推荐
相关产品推荐

