Javascript 如何在react redux中重定向之前等待操作完成?
我正在尝试根据redux商店的isLoggedin状态登录用户。我的登录组件从映射到道具的userLogin操作中分派fetchLogin操作Javascript 如何在react redux中重定向之前等待操作完成?,javascript,reactjs,redux,promise,async-await,Javascript,Reactjs,Redux,Promise,Async Await,我正在尝试根据redux商店的isLoggedin状态登录用户。我的登录组件从映射到道具的userLogin操作中分派fetchLogin操作 const Login = (props) => { const [userLogin, setUserLogin] = useState({ email: "", password: "" }) const getValue = e => { e.preventDefault(); setU
const Login = (props) => {
const [userLogin, setUserLogin] = useState({ email: "", password: "" })
const getValue = e => {
e.preventDefault();
setUserLogin({
...userLogin,
[e.target.name]: e.target.value
});
}
const makeRequest = (e) => {
e.preventDefault()
props.userLogin(userLogin)
if (props.isLoggedin === true) {
console.log(Cookie.get('accessToken'))
props.history.push('/dashboard')
}
}
return (
<Fragment>
<Form onSubmit={makeRequest}>
<Form.Group controlId="formBasicEmail">
<Form.Label>Email Address</Form.Label>
<Form.Control
type="email"
name="email"
placeholder="Enter email"
onChange={getValue}
>
</Form.Control>
</Form.Group>
<Form.Group controlId="formBasicPassword">
<Form.Label>Password</Form.Label>
<Form.Control
type="password"
name="password"
placeholder="Enter password"
onChange={getValue}
>
</Form.Control>
</Form.Group>
<Button
variant="primary"
type="submit"
>
Login
</Button>
</Form>
</Fragment>
)
}
const mapStateToProps = (state) => ({
isFetching: state.userReducer.isFetching,
isLoggedin: state.userReducer.isLoggedin,
isError: state.userReducer.isError,
errMessage: state.userReducer.errMessage
});
const mapDispatchToProps = dispatch => ({
userLogin: (userLogin) => {
dispatch(fetchLogin(userLogin))
}
});
export default connect(
mapStateToProps,
mapDispatchToProps
)(Login)
您可以从操作中返回承诺,并在解决后设置
isLoggedin
状态:
export const fetchLogin = (userLogin) => dispatch => {
dispatch(userLoginRequest())
return axios.post('/login', {
email: userLogin.email,
password: userLogin.password
})
.then(response => {
if (response.status === 200) {
dispatch(userLoginSuccess(response.data))
}
return response;
}).catch(err => {
console.log("Error", err)
dispatch(userLoginFailed())
})
}
// ...
const makeRequest = (e) => {
e.preventDefault()
props.userLogin(userLogin).then(resp => {
if (props.isLoggedin === true) {
console.log(Cookie.get('accessToken'))
props.history.push('/dashboard')
}
})
}
此外,为了实现此功能,您需要更新mapDispatchToProps
,以实际返回调度:
const mapDispatchToProps = dispatch => ({
userLogin: (userLogin) => dispatch(fetchLogin(userLogin))
});
还有一件事,我刚刚意识到,在这种情况下,使用dispatch的承诺正确重定向实际上是没有必要的,因为可以在useEffect
中跟踪isLoggedin
prop
const makeRequest = (e) => {
e.preventDefault()
props.userLogin(userLogin)
}
useEffect(() => {
if (props.isLoggedin === true) {
console.log(Cookie.get('accessToken'))
props.history.push('/dashboard')
}
}, [props.isLoggedin])
我知道我需要返回一个承诺,但似乎我们实际上并没有返回承诺,我得到了一个错误。then不是一个函数。
return response
应该在条件之外,更新了答案。不,仍然不工作,我仍然得到相同的错误,但是在定义useLogin函数的mapDispatchToProps中,问题似乎是承诺没有直接返回到它。啊,对,你需要在那里使用隐式返回。更新了答案。你是马安人!是的,我早就认为这可能管用,但我傻了,没有尝试。非常感谢。
const makeRequest = (e) => {
e.preventDefault()
props.userLogin(userLogin)
}
useEffect(() => {
if (props.isLoggedin === true) {
console.log(Cookie.get('accessToken'))
props.history.push('/dashboard')
}
}, [props.isLoggedin])