首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在React JS redux中同时使用compose()和connect()

在React JS redux中同时使用compose()和connect()
EN

Stack Overflow用户
提问于 2018-07-10 20:32:17
回答 5查看 21K关注 0票数 25

我开始使用React JS开发web应用程序。我从主题森林买了一个主题。在主题中,他们在组件中像这样使用compose。

代码语言:javascript
复制
...Other code here
 Login.propTypes = {
      classes: PropTypes.shape({}).isRequired,
      width: PropTypes.string.isRequired
    };

    export default compose(withWidth(), withStyles(themeStyles, { withTheme: true }))(Login);

正如您所看到的,在导出组件时,他们的代码在末尾使用了compose。我不能修改他们的内置结构。我现在想做的是,我也喜欢使用react的连接功能。

Normally用来代替connect。现在,如果我想使用connect来处理应用程序的状态,我如何将其与compose一起使用?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-07-10 20:39:35

代码语言:javascript
复制
const enhance = compose(
    withRouter,
    withStyles(styles, 'some style'),
    connect(mapStateToProps, mapDispatchToProps),
    ....

export default enhance(MyComponent);
票数 36
EN

Stack Overflow用户

发布于 2018-07-10 20:47:31

代码语言:javascript
复制
import {bindActionCreators} from 'redux';
import compose from 'recompose/compose';
import { connect } from 'react-redux';
...Other code here
function mapStateToProps(state) {
    return {
        //return state
    }
}
function mapDispatchToProps(){
    return bindActionCreators({
        //actions
    }, dispatch);
}
Login.propTypes = {
    classes: PropTypes.shape({}).isRequired,
    width: PropTypes.string.isRequired
};
export default compose(withWidth(), withStyles(styles, {withTheme: true}), connect(mapStateToProps, mapDispatchToProps))(Login);

我希望这能解决你的问题。

票数 7
EN

Stack Overflow用户

发布于 2019-04-17 08:08:00

compose没有摆脱将函数传递给函数调用结果的模式,但它将其使用减少为一种。

只有一个点,使用compose没有任何好处:

代码语言:javascript
复制
// withStyles, without compose
export default withStyles(styles)(MyComponent)

// withStyles, with compose
export default compose(withStyles(styles))(MyComponent)

// connect, without compose
export default connect(mapStateToProps, mapDispatchToProps)(MyComponent)

// connect, with compose
export default compose(connect(mapStateToProps, mapDispatchToProps))(MyComponent)

请注意,在函数调用之后立即启动另一个函数调用,这是最近才流行起来的,在compose中仍然存在。

对于两个HOC,compose有一个好处,因为parens的嵌套更少:

代码语言:javascript
复制
// two HOCs, without compose
export default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles)(MyComponent))

// two HOCs, with compose
export default compose(connect(mapStateToProps, mapDispatchToProps), withStyles(styles))(MyComponent)

如果你不习惯一个无名函数在创建后立即被调用,这仍然很难理解。如果你愿意,你可以给它一个名字:

代码语言:javascript
复制
// two HOCs, with compose
const enhance = compose(connect(mapStateToProps, mapDispatchToProps, withStyles(styles));
// export default enhance(MyComponent);

当有多个HOC时,我更喜欢使用compose,并且直接使用它。我认为减少嵌套是有用的,但没有必要给它起一个像enhance这样的通用名称。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51265319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档