Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript React useReducer未更新状态_Javascript_Reactjs_React Hooks_Use Reducer - Fatal编程技术网

Javascript React useReducer未更新状态

Javascript React useReducer未更新状态,javascript,reactjs,react-hooks,use-reducer,Javascript,Reactjs,React Hooks,Use Reducer,当用户登录失败时,我正在使用useReducer更新errorsState。我读过很多解决方案,据说dispatch是异步的,我知道这一点,所以我将console.log放在useffect中,以查看errorsState的更改,但不幸的是它没有更改。这是我的密码 Login.jsx 导出默认函数登录({userProps}){ // //一些变量和状态 // const{loading,user}=useLogin({email:state.email},state.submitted) co

当用户登录失败时,我正在使用
useReducer
更新
errorsState
。我读过很多解决方案,据说
dispatch
是异步的,我知道这一点,所以我将
console.log
放在
useffect
中,以查看
errorsState
的更改,但不幸的是它没有更改。这是我的密码

Login.jsx

导出默认函数登录({userProps}){
//
//一些变量和状态
//
const{loading,user}=useLogin({email:state.email},state.submitted)
const[errors,dispatch]=useReducer(errorsReducer,errorsState)
useffect(()=>{
console.log(“errors”,errors)//不会触发它,因为errors状态没有从UseLogin更新
},[错误])
返回内容
}
这里是fetch函数
useLogin

AuthAction.js

export const useLogin=(数据,已提交)=>{
const[state,dispatch]=useReducer(userReducer,userState)
const[errors,errorsDispatch]=useReducer(errorsReducer,errorsState)
useffect(()=>{
如果(!已提交)返回
派遣({
类型:用户操作。发出请求,
})
ticketApi.login(数据)。然后({res,status})=>{
如果(状态!=“失败”){
//保存到本地存储
常量{token}=res
//将令牌设置为本地存储
setItem(“jwtToken”,token)
//将令牌设置为Auth头
setAuthToken(令牌)
//解码令牌以使用jwt解码获取用户数据
const decoded=jwt_decode(令牌)
//设置当前用户
退货({
类型:USER\u ACTIONS.GET\u USER,
有效载荷:已解码,
})
}
派遣({
类型:用户\u操作。结束\u请求,
})
返回错误分发({
类型:ERRORS\u ACTIONS.GET\u ERRORS,
有效载荷:res.response.data,
})
})
},[提交])
返回状态
}
我尝试将
console.log
放入
ERRORS\u操作中。获取\u ERRORS
以查看响应,结果很好。
那么我哪里出错了?

useReducer
允许您更好地管理复杂的状态,它不是一个状态容器,您要做的是创建两个不同的状态,一个在
useLogin
内部,另一个在
Login
组件中,从
useLogin
hook返回
errors
,以便登录组件可以看到它

登录

导出默认函数登录({userProps}){
//
//一些变量和状态
//
const{loading,user,errors}=useLogin({email:state.email},state.submitted)
useffect(()=>{
日志(“错误”,错误)
},[错误])
返回内容
}
使用登录

export const useLogin=(数据,已提交)=>{
const[state,dispatch]=useReducer(userReducer,userState)
const[errors,errorsDispatch]=useReducer(errorsReducer,errorsState)
useffect(()=>{
如果(!已提交)返回
派遣({
类型:用户操作。发出请求,
})
ticketApi.login(数据)。然后({res,status})=>{
如果(状态!=“失败”){
//保存到本地存储
常量{token}=res
//将令牌设置为本地存储
setItem(“jwtToken”,token)
//将令牌设置为Auth头
setAuthToken(令牌)
//解码令牌以使用jwt解码获取用户数据
const decoded=jwt_decode(令牌)
//设置当前用户
退货({
类型:USER\u ACTIONS.GET\u USER,
有效载荷:已解码,
})
}
派遣({
类型:用户\u操作。结束\u请求,
})
返回错误分发({
类型:ERRORS\u ACTIONS.GET\u ERRORS,
有效载荷:res.response.data,
})
})
},[提交])
返回{…状态,错误};
}

我想您可能在两种不同的错误状态下调用了
useReducer
。对其中一个采取行动,对另一个进行检查。我认为这是正确的。因为除了
错误减速机
之外,没有其他
错误
变量,我知道这听起来很傻,但是。。。你的自定义钩子是大写的,它应该以小写的
use
开头,试着改变一下,什么都不改变,仍然不起作用
errorsState
从哪里来?是的,这很有意义。我认为
useReducer
的工作原理与
redux
相同。非常感谢,但我已经开始使用
redux