Я недавно использую redux-thunk
и встречаю такой случай:
В функции создателя действий при регистрации я хочу сделать history.push
после отправки действия при успешной регистрации код может выглядеть следующим образом:
// SignupAction.js
export const signupRequest = (userData) => {
return dispatch => {
dispatch(signupPending())
return axios.post('/api/user', userData)
.then(res => dispatch(signupSuccess()))
.then(() => {
// wanna do history.push('/') to the home page after successfully signup
})
.catch(error => dispatch(signupFailure(error.message)))
}
}
Сейчас я в замешательстве, я пытаюсь объединить все логи c в одно действие, но нет способа ввести history
в мое действие регистрации. Я могу дать signupRequest
функции второй аргумент, это может быть сам объект history
: signupRequest(userData, history)
, или я могу просто передать обратный вызов: signupRequest(userData, callback)
. Однако я не уверен, какой из них лучше.
Существует также альтернативный способ получить историю, мне не нужно помещать все логи c в одно действие, поэтому signup action
просто вернет обещание, и я буду разбираться с ним позже в компоненте, в этом случае доступ к history
будет довольно простым:
// signupAction.js
export const signupRequest = (userData) => {
return dispatch => {
return axios.post('/api/users', userData);
}
}
// signupForm.js
export default class SignupForm extends Component {
// ...
handleSubmit = e => {
const userData = e.target.value
this.props.signupRequest(userData)
.then(() => this.props.dispatch(signupSuccess()))
.then(() => {
// now i can easily access history inside the component
this.props.history.push('/')
})
.catch(error => dispatch(signupFailure(error.message))) }
}
Итак, по какому пути я должен следовать, и есть ли лучшая практика решить эту проблему?