В React вы обычно достигаете перенаправлений в componentDidUpdate
ваших компонентов.
В случае асинхронных действий вы будете проверять флаг, хранящийся в хранилище Redux, как правило, логический, такой как isFetching
, isCreating
, isUpdating
и т. Д., Который будет изменен действиями.
Простой пример:
class EditUser extends Component {
compondentDidUpdate(prevProps) {
if (prevProps.isUpdating && !this.props.isUpdating) {
// ↑ this means that the async call is done.
history.push('/users')
}
}
updateUser() {
const modifiedUser = // ...
this.props.updateUser(modifiedUser)
// ↑ will change state.users.isUpdating from false to true during the async call,
// then from true to false once the async call is done.
}
render() {
// ...
<button onClick={this.updateUser}>Update</button>
// ...
}
}
const mapStateToProps = (state, props) => ({
userToEdit: state.users.items.find(user => user.id === props.userId)
isUpdating: state.users.isUpdating,
})
const mapActionsToProps = {
updateUser: usersActions.updateUser,
}
export default connect(mapStateToProps, mapActionsToProps)(EditUser)
Следующим шагом обычно является добавление еще одного флага в ваше хранилище Redux, чтобы отслеживать успешность асинхронных вызовов или нет (например, state.users.APIError
, в котором вы можете сохранить ошибку, возвращаемую API). Тогда вы достигнете перенаправления только при отсутствии ошибок.