我正在看一个React-Redux应用程序,并尝试了解一切如何工作。
在其中一个组件中,我看到了以下代码行:
import { bindActionCreators } from "redux";
...
function mapDispatchToProps(dispatch) {
return bindActionCreators({ fetchPhotos }, dispatch);
}
export default connect(
null,
mapDispatchToProps
)(SearchBar);
如果我将上面的代码更改为以下代码,则一切仍然可以正常进行,没有任何错误:
function mapStateToProps(photos) {
return { photos };
}
export default connect(
mapStateToProps,
{ fetchPhotos }
)(SearchBar);
在我看来,我使用connect的方式似乎更容易理解,也不需要导入额外的库。
是否有任何原因导入 bindActionCreators 并使用 mapDispatchToProps ?
答案 0 :(得分:1)
我个人避免明确使用bindActionCreators。我更喜欢直接在内部使用bindActionCreators的mapDispatchToProps调度函数。
const mapStateToProps = state => ({
photos: state.photos.photos
});
const mapDispatchToProps = dispatch => ({
fetchPhotos: () => dispatch(fetchPhotos())
// ...Other actions from other files
});
export default connect(mapStateToProps, mapDispatchToProps)(SearchBar);
在两种情况下,您将显式使用bindActionCreators,但这两种方法都不是最佳实践:
this.props.fetchPhotos
传递给子组件,而无需使用bindActionCreators。class SearchBar extends React.Component {
render() {
return (
<React.Fragment>
<ChildComponentOfSearchBar fetchPhotos={this.props.fetchPhotos} />
</React.Fragment>
)
}
}
const mapStateToProps = state => ({
photos: state.photos.photos
});
const mapDispatchToProps = () => bindActionCreators({ fetchPhotos }, dispatch);
export default connect(mapStateToProps, mapDispatchToProps)(SearchBar);
class SearchBar extends React.Component {
constructor(props) {
super(props);
this.fetchPhotosAction = bindActionCreators({ fetchPhotos: this.searchFunction }, dispatch);
}
searchFunction = (text) => {
return {
type: ‘SEARCH_ACTION’,
text
}
}
render() {
return (
<React.Fragment>
// Importing selectively
<ChildComponentOfSearchBar fetchPhotos={this.fetchPhotosAction} />
</React.Fragment>
)
}
}
const mapStateToProps = state => ({
photos: state.photos.photos
});
export default connect(mapStateToProps, null)(SearchBar)
答案 1 :(得分:1)
我是Redux的维护者。
是的,您显示的第二个示例使用the "object shorthand" form of mapDispatch
。
我们建议始终使用mapDispatch
的“对象简写”形式,除非您出于特殊原因需要自定义调度行为。