在 React JS redux 中一起使用 compose() 和 connect()
Using compose() and connect() together in React JS redux
我开始使用 React JS 开发 Web 应用程序。我从主题森林买了一个主题。在主题中,他们在组件中使用这样的组合。
...Other code here
Login.propTypes = {
classes: PropTypes.shape({}).isRequired,
width: PropTypes.string.isRequired
};
export default compose(withWidth(), withStyles(themeStyles, { withTheme: true }))(Login);
如您所见,他们的代码在导出组件时在最后使用了 compose。我不能修改他们的建筑结构。我现在喜欢做的是我也喜欢使用反应的连接功能。
一般用connect代替compose。现在,如果我想使用 connect 来处理应用程序的状态,我该如何将它与 compose 一起使用?
const enhance = compose(
withRouter,
withStyles(styles, 'some style'),
connect(mapStateToProps, mapDispatchToProps),
....
export default enhance(MyComponent);
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);
希望这能解决您的问题。
compose
并没有摆脱将函数传递给函数调用结果的模式,但它减少了它的使用。
只有一个 HOC,使用 compose 没有任何好处:
// 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
有好处,因为括号的嵌套更少:
// 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)
如果您不习惯在创建后立即调用无名函数,那么这仍然很难理解。如果您愿意,可以给它起个名字:
// two HOCs, with compose
const enhance = compose(connect(mapStateToProps, mapDispatchToProps, withStyles(styles));
// export default enhance(MyComponent);
我比较喜欢在HOC不止一个的时候用compose,直接用。我认为减少嵌套是有用的,但给它一个像 enhance
这样的通用名称是不必要的。
import {connect} from "react-redux";
import {compose} from 'redux'
class BookList extends Component {
componentDidMount() {
const {bookstoreService} = this.props;
const data = bookstoreService.getBooks();
this.props.booksLoaded(data);
}
render() {
const {books} = this.props;
return (
<ul>
{books.map(book => {
return (
<li key={book.id}>
<BookListItem book={book}/>
</li>
);
})}
</ul>
);
}
}
const mapStateToProps = ({books}) => {
return {books};
};
const mapDispatchToProps = dispatch => {
return {
booksLoaded: newBooks => {
dispatch(booksLoaded(newBooks));
}
};
};
export default compose(withBookstoreService(), connect(mapStateToProps, mapDispatchToProps))(BookList);
我在将 compose
与 Typescript 一起使用时收到以下错误:
JSX element type 'App' does not have any construct or call signatures. TS2604
我必须按以下方式添加 ComponentType
才能使其正常工作:
export default compose<ComponentType>(withTranslation(), connect(mapStateToProps, mapDispatchToProps))(App);
我开始使用 React JS 开发 Web 应用程序。我从主题森林买了一个主题。在主题中,他们在组件中使用这样的组合。
...Other code here
Login.propTypes = {
classes: PropTypes.shape({}).isRequired,
width: PropTypes.string.isRequired
};
export default compose(withWidth(), withStyles(themeStyles, { withTheme: true }))(Login);
如您所见,他们的代码在导出组件时在最后使用了 compose。我不能修改他们的建筑结构。我现在喜欢做的是我也喜欢使用反应的连接功能。
一般用connect代替compose。现在,如果我想使用 connect 来处理应用程序的状态,我该如何将它与 compose 一起使用?
const enhance = compose(
withRouter,
withStyles(styles, 'some style'),
connect(mapStateToProps, mapDispatchToProps),
....
export default enhance(MyComponent);
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);
希望这能解决您的问题。
compose
并没有摆脱将函数传递给函数调用结果的模式,但它减少了它的使用。
只有一个 HOC,使用 compose 没有任何好处:
// 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
有好处,因为括号的嵌套更少:
// 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)
如果您不习惯在创建后立即调用无名函数,那么这仍然很难理解。如果您愿意,可以给它起个名字:
// two HOCs, with compose
const enhance = compose(connect(mapStateToProps, mapDispatchToProps, withStyles(styles));
// export default enhance(MyComponent);
我比较喜欢在HOC不止一个的时候用compose,直接用。我认为减少嵌套是有用的,但给它一个像 enhance
这样的通用名称是不必要的。
import {connect} from "react-redux";
import {compose} from 'redux'
class BookList extends Component {
componentDidMount() {
const {bookstoreService} = this.props;
const data = bookstoreService.getBooks();
this.props.booksLoaded(data);
}
render() {
const {books} = this.props;
return (
<ul>
{books.map(book => {
return (
<li key={book.id}>
<BookListItem book={book}/>
</li>
);
})}
</ul>
);
}
}
const mapStateToProps = ({books}) => {
return {books};
};
const mapDispatchToProps = dispatch => {
return {
booksLoaded: newBooks => {
dispatch(booksLoaded(newBooks));
}
};
};
export default compose(withBookstoreService(), connect(mapStateToProps, mapDispatchToProps))(BookList);
我在将 compose
与 Typescript 一起使用时收到以下错误:
JSX element type 'App' does not have any construct or call signatures. TS2604
我必须按以下方式添加 ComponentType
才能使其正常工作:
export default compose<ComponentType>(withTranslation(), connect(mapStateToProps, mapDispatchToProps))(App);