javascript - 通过 useSelector 访问集中存储
问题描述
我有如下登录功能-
function SignIn() {
const loginInfo = useSelector(state => state.loginDetails);
const iLoginCreds ={
userName:'',
password:'',
isLoggedIn:false
}
const dispatch = useDispatch();
const [loginCreds, setLoginCredentials] = useState(iLoginCreds)
useEffect(() => {
alert("state changed : "+loginCreds.isLoggedIn);
}, [loginCreds])
function checkIfSignedIn()
{
axios.get(`https://localhost:44301/api/login/ValidateLogin`)
.then(res=>{
console.log(JSON.stringify(res.data));
setLoginCredentials({
...loginCreds,
isLoggedIn:res.data
});
dispatch(StoreUserAuthenticationStatusAction(res.data));
});
}
if(loginInfo.isLoggedIn==true)
{
return (
<MainPage></MainPage>
)
}
else
{
return (
...
...
<FormGroup>
<Button style={{width:'100%',backgroundColor:"#FCB724",color:"black",fontWeight:"bold"}} onClick={checkIfSignedIn} >Sign in using our secure server</Button>
</FormGroup>
)
}
减速机指数:-
import { combineReducers } from "redux";
import {SaveLoginStatusReducer} from "./LoginReducers"
export const reducers=combineReducers({
loginDetails:SaveLoginStatusReducer
})
问题 -
什么时候if(loginInfo.isLoggedIn==true)
,我从useSelector
一开始就提取,我想渲染到MainPage
. 但不知何故看不到,数据是从中央存储中获取的。即使状态已更新,页面也不会呈现到 MainPage。
useEffect
当状态发生变化时,我能够得到警报,因为我已经使用过。它显示“真实”。
编辑1:-
当我使用时 if(loginCreds.isLoggedIn==true)
,我可以看到MainPage
,但是当我尝试从商店中检索它时if(loginInfo.isLoggedIn==true)
,我不明白。
编辑2:-
Action.js -
export const StoreUserAuthenticationStatusAction=(loginPayload)=>{
return {
type:'SaveLoginStatus',
payload:loginPayload
}
}
export const SetProductList=(productListPayload)=>{
return {
type:'SetProductList',
payload:productListPayload
}
}
减速器.js -
const iLoginCreds ={
userName:'',
password:'',
isLoggedIn:false
}
export const SaveLoginStatusReducer =(state=iLoginCreds,action)=>{
switch (action.type) {
case 'SaveLoginStatus':
return {
...state,
user:action.paylod
}
break;
default:
return state;
}
}
解决方案
Code Pattern 看起来很糟糕,您必须使用 authGuard 来保护私有路由。如果用户未登录,则应重定向到身份验证页面。登录后重定向到主页。
const handleLogin = (e) => {
e.preventDefault();
if (user.email === email && user.password === password) {
login();
history.push("/main-page");
}
};
<Route
{...rest}
render={(props) =>
isLogin() ? <Component {...props} /> : <Redirect to="/login" />
}
/>
推荐阅读
- xml - 什么命令用于 FirstLogonCommand 自动无人参与中的同步命令以从拇指驱动器安装应用程序
- javascript - 如何使组件内的文本居中?
- javascript - 如何总结两个 React 道具?
- android - 当存在 lintCheck 依赖项时,Gradle 构建工具 4.1.0 在 Android Studio 中同步失败
- android - SyncAdapter 接收聊天消息?
- python - 如何根据多个列的条件汇总 Pandas 中的行并删除重复项?
- swift - 如何向自定义意图处理程序提供动态数据?
- reactjs - 反应 setState 不设置输入字段的状态
- python - Zeppelin 中的 python.sql 错误:NameError: name 'pysqldf' is not defined
- networking - 是否可以为本地子域创建 SSL 证书?