Лично я избегаю явного использования bindActionCreators.Я предпочитаю отправлять функции напрямую с помощью mapDispatchToProps, который внутренне использует bindActionCreators.
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, оба не являются оптимальными:
- Если у вас есть дочерний компонент для SearchBar, который не подключается к redux, но вы хотите передать действия, отправленные в качестве подпорки к нему, вы можете использовать bindActionCreators.Лучшая практика будет делать то же самое с примером I. Вы можете просто передать
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);
Существует еще один маловероятный сценарий, в котором вы можете использовать bindActionCreators, определяя actionCreator внутри компонента.Это не поддерживаемо и не является хорошим решением, поскольку типы действий жестко запрограммированы и не могут использоваться повторно.
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)