У меня есть форма входа в систему, которая должна перенаправить пользователя на целевую страницу, если в базе данных существует электронная почта пользователя.
У меня есть класс с именем "FormToLogin" с методом, называемым login
. В методе login
я отправляю данные и this.props.history
в действие с именем loginAct
.
Контейнер:
class FormToLogin extends Component {
login = fullForm => {
const { dispatch } = this.props;
const data = {[user]: {...fullForm}}
return dispatch(login(data, this.props.history)) <-- apparently, passing history to an action is not good)
}
}
Как видите, я вызываю действие, передавая данные (которые будут включать в себя адрес электронной почты, введенный пользователем) и историю, потому что я хочу сделать .push('/new_url')
, если электронная почта существует в базе данных.
Действие:
export const login = (data, history, dispatch) => {
return api.post(url, data)
.then(({ status, h, data }) => {
// whatever if it returns 200
}
.catch(({ response }) => {
dispatch(loginFail());
const status = (response || {}).status;
if (status === 401 && hasError(error_user, response.data)) {
history.push('/new_url') // This is INCORRECT
?? -- what do I need here -- ??
}
})
}
Мне сказали, что плохая практика - передавать историю маршрутов действию.
Итак, history.push()
не должно происходить здесь.
Мне было предложено добавить улов на уровне контейнера ("FormToLogin").
Итак, я попытался создать перехват в Container(FormToLogin)
, когда я вызываю Action с помощью dispatch(login(data))
, но он не работает. Также var status
не существует в контейнере.
BEFORE: return dispatch(login(data, this.props.history))
AFTER: .catch(e => {
if (status === 401 && hasError(
error_user,
e.response.data
)) {
history.push('/new_url);
} throw e; })
Что мне нужно добавить или изменить?