mysql - useSelector 函数没有更新调度函数后的状态 -react hooks
问题描述
我正在执行一个身份验证模块,当我单击登录按钮时,我正在验证用户是否存在 MySQL db。我在登录页面中调度功能
基本上,当我调度它时, rSignedIn 的 null 状态不会在调度函数之后立即更改。我完全使用反应钩子。请帮我解决这个问题,我已经尝试了三天。
但是当我再次单击登录按钮时 rSignedIn 状态值会更新,一般来说,当我使用 useSelector 使用状态值时,值会在调用 handleLogin() 时第二次更新
//Sign in Page
...
...
const status=useSelector((state)=>state);
...
...
const handleLogin=(event)=>{
dispatch(LoginUser(loginData));
console.log(status.auth.rSignedIn);
if(status.auth.rSignedIn){
console.log("LOGIN success");
History.push('/');
}else{
console.log("LoginFailed") ;
}
}
这是我向 MySQL db 发送请求的操作索引页面,如果有响应,我将发送它,否则会出错。
export const LoginUser=(loginData)=>async(dispatch)=>{
await mysqlDB.post('/fetch/retreive',loginData)
.then((response)=>dispatch({type:ActionTypes.LOGIN_SUCCESS,payload:response.data}))
.catch((error)=>dispatch({type:ActionTypes.LOGIN_FAILED}))
}
这是我的减速器:
const initialState = {
gSignedIn:null,
userId:null,
registered:null,
data:null,
rSignedIn:null,
}
export default (state=initialState,action)=>{
switch (action.type){
case ActionTypes.GSIGN_IN:
return {...state,gSignedIn:true,userId: action.payload};
case ActionTypes.GSIGN_OUT:
return {...state,gSignedIn:false,userId:null};
case ActionTypes.REGISTER_SUCCESS:
return {...state,registered:true,data: action.payload};
case ActionTypes.REGISTER_FAILED:
return {...state,registered:false,data:null};
case ActionTypes.LOGIN_SUCCESS:
return {...state,rSignedIn:true,data: action.payload};
case ActionTypes.LOGIN_FAILED:
return {...state,rSignedIn:false,data:null};
case ActionTypes.LOGOUT:
return {...state,rSignedIn:false,data:null};
default:
return state;
}
};
解决方案
dispatch
不会立即更新您的状态值。状态值受闭包约束,只会在您的下一个渲染周期中更新。
您可以history.push
在您的内部使用action
或使用 useEffect
const handleLogin=(event)=>{
dispatch(LoginUser(loginData, History));
}
...
export const LoginUser=(loginData, history)=>async(dispatch)=>{
await mysqlDB.post('/fetch/retreive',loginData)
.then((response)=>{
dispatch({type:ActionTypes.LOGIN_SUCCESS,payload:response.data}));
history.push('/')
}
.catch((error)=>{
dispatch({type:ActionTypes.LOGIN_FAILED}))
}
}
使用 useEffect,您只需要在更改时运行它,而不是在初始渲染时运行
const initialRender = useRef(true);
useEffect(() => {
if(!initialRender.current) {
if(state.auth.rSignedIn) {
history.push('/');
} else {
console.log(not signed in);
}
} else {
initialRender.current = false;
}
}, [state.auth.rSignedIn])
推荐阅读
- ionic-framework - Ionic 3,可编辑选择
- php - 解析嵌套数组并将其保存在具有父 ID 的 mysql db 中
- c++ - 子类化 STL 容器:范围构造函数不起作用
- javascript - 如何在 2 个反应本机应用程序之间共享通用代码
- objective-c - 找到项目,然后在 NSMutableData 数组中删除它
- cors - 即使响应标头中存在访问控制允许来源→*也没有'访问控制允许来源(在邮递员中检查)
- android - Android Studio -- 设计器屏幕空白
- java - 如何将此排序映射方法从 java 转换为 Kotlin
- google-cloud-platform - 跨项目端点访问 - GCP
- python-3.x - 使用 Pytest 在函数中引发的模拟异常