【发布时间】:2018-02-18 16:09:21
【问题描述】:
我有一个简单的用例,在 React-Router 4 和 Redux 环境中似乎很难实现。
当用户登录时,会触发 redux 承诺操作,该操作会返回 API 令牌、到期日期和其他一些信息。何时以及如果实现了承诺,我希望将用户重定向到另一个页面。
我无法弄清楚如何使用上述架构以编程方式重定向用户。想在Action.js里面做,但是感觉只能在Reducers.js里面做。即使我不确定如何开始。
到目前为止,我发现的最佳方法是在我的视图中添加一个 Redirect 组件,并让 promise 将 loggedIn 状态设置为 true,如果该视图上的 loggedIn 道具为 true,它将返回重定向道具,然后将用户重定向到所需的页面。不知何故,这感觉像是一个简单用例的大量额外代码。
任何建议都会有所帮助。谢谢。
Action.js:
import axios from 'axios';
export function login(email, password) {
return {
type: 'LOGIN_USER',
payload: axios.post('http://localhost:3114/api/users/authenticate',
{
email,
password,
}),
};
}
Reducers.js
// Promise
// pending
// fulfilled
// rejected
const initalState = {
token: null,
expiryDate: '',
loading: false,
error: null,
};
// REDCUER
function loginReducer(state = initalState, action) {
switch (action.type) {
case 'LOGIN_USER_PENDING':
return { ...state, loading: true };
case 'LOGIN_USER_FULFILLED':
return {
...state,
loading: false,
token: action.payload.data.token,
expiryDate: action.payload.data.expires,
loggedIn: true,
};
case 'LOGIN_USER_REJECTED':
return { ...state, loading: false, error: `${action.payload}` };
default:
return state;
}
}
export default loginReducer;
LoginView.js
render() {
const { data, login, loggedIn } = this.props;
if (data.loggedIn) {
return <Redirect to="/users" push />;
}
return (
...
)
}
问候, 埃米尔
【问题讨论】:
-
像我建议的那样,
history.push运气好吗? -
@jonahe 感谢您的跟进。一天之内就会告诉你。目前正在处理 3 个项目,有点杂耍。
标签: redux react-redux react-router-v4 redux-promise redux-promise-middleware