Mysql useSelector函数未更新后调度函数-react钩子的状态
我正在执行一个身份验证模块,当我单击“登录”按钮时,我正在验证当前用户是否为MySQL db。我正在登录页面中将函数发送到此处 基本上,当我分派它时,rSignedIn的null状态在分派函数之后不会立即改变。我完全是在用鱼钩。请帮我解决这个问题,我已经试了三天了 但是当我再次单击login按钮时,rSignedIn状态值会更新。通常,当我使用useSelector使用状态值时,该值会在调用handleLogin()时第二次更新Mysql useSelector函数未更新后调度函数-react钩子的状态,mysql,reactjs,redux,react-redux,react-hooks,Mysql,Reactjs,Redux,React Redux,React Hooks,我正在执行一个身份验证模块,当我单击“登录”按钮时,我正在验证当前用户是否为MySQL db。我正在登录页面中将函数发送到此处 基本上,当我分派它时,rSignedIn的null状态在分派函数之后不会立即改变。我完全是在用鱼钩。请帮我解决这个问题,我已经试了三天了 但是当我再次单击login按钮时,rSignedIn状态值会更新。通常,当我使用useSelector使用状态值时,该值会在调用handleLogin()时第二次更新 //Sign in Page ... ... const st
//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
不会立即更新您的状态值。状态值由闭包绑定,仅在下一个渲染周期中更新
您可以使用历史记录。在操作中按
,也可以使用useEffect
const handleLogin=(event)=>{
dispatch(LoginUser(loginData, History));
}
使用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])
但是如果我想在同一页中呈现state值呢?而且正如你说的使用useEffect我使用过一次,当我点击登录页面时,它会重定向到主页,但它没有进入登录页面,useEffect的使用不允许我进入登录页面,可能是我的语法错误,你能帮我使用useEffect函数吗?你可以在返回部分回复要更新的状态值,这样你就可以渲染它了。只是不要在同一个函数中使用它,希望它被更新,但是如果我想在同一个页面中呈现状态值呢?而且正如你说的使用useEffect我使用过一次,当我点击登录页面时,它会重定向到主页,但它没有进入登录页面,useEffect的使用不允许我进入登录页面,可能是我的语法错误,你能帮我使用useEffect功能吗?更新了我的帖子,告诉我你将如何使用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])