javascript - Reactjs - 我的 redux 没有存储用户
问题描述
我正在尝试使用 redux 存储用户。然后我想使用用户的详细信息来帮助过滤数据并显示在导航栏上以显示是否已登录。我能够通过使用会话和 cookie 来保持用户保持登录状态,没有任何障碍。
在 redux 中,我的商店已成功创建,并且用户在更新之前已正确初始化为 null。但是,在登录时,用户不会在 redux 存储中更新。即使在我的会话中登录用户仍然为空,用户也已登录。
index.js:
import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
import "bootstrap/dist/css/bootstrap.min.css";
import { Provider } from "react-redux";
import store from "./app/store";
ReactDOM.render(
<React.StrictMode>
<Provider store={store}>
<App />
</Provider>
</React.StrictMode>,
document.getElementById("root")
);
reportWebVitals();
login_componenet.js:
//import "bootstrap/dist/css/bootstrap.min.css";
import React, { useState, useEffect } from "react";
import axios from "axios";
import { useDispatch } from "react-redux";
function Login() {
const [LoginID, setLoginID] = useState("");
const [Password, setPassword] = useState("");
const [LoginStatus, setLoginStatus] = useState("");
const [email, setEmail] = useState("");
const [logID, setLogID] = useState("");
const [id, setId] = useState("");
axios.defaults.withCredentials = true;
const login = (event) => {
axios
.post("http://localhost:8000/login", {
LoginID: LoginID,
Password: Password,
})
.then((response) => {
console.log(response.data.result[0]);
if (response.data.message) {
setLoginStatus(response.data.message);
} else {
setLoginStatus(response.data[0].UserFullName);
setEmail(response.data.result[0].UserEmailID);
setLogID(response.data.result[0].LoginID);
setId(response.data.result[0].UserID);
}
});
};
const dispatch = useDispatch();
const handleSubmit = (e) => {
e.preventDefault();
dispatch(
login({
name: LoginStatus,
LoginId: logID,
email: email,
id: id,
loggedIn: true,
})
);
};
useEffect(() => {
axios.get("http://localhost:8000/login").then((response) => {
if (response.data.loggedIn === true) {
setLoginStatus(response.data.user[0].UserFullName);
}
});
}, []);
return (
<div className="App">
<div className="auth-wrapper">
<div className="auth-inner">
<form onSubmit={(e) => handleSubmit(e)}>
<h3>Log In</h3>
<div className="form-group ">
<label>Login ID</label>
<input
type="text"
className="form-control"
placeholder="Login ID"
onChange={(e) => {
setLoginID(e.target.value);
}}
/>
</div>
<div className="form-group">
<label>Password</label>
<input
type="password"
className="form-control"
placeholder="Password"
onChange={(e) => {
setPassword(e.target.value);
}}
/>
</div>
<button className="btn btn-primary btn-block" onClick={login}>
Login
</button>
</form>
<h1>{LoginStatus}</h1>
</div>
</div>
</div>
);
}
export default Login;
商店.js:
import { configureStore } from "@reduxjs/toolkit";
import userReducer from "../features/userSlice";
export default configureStore({
reducer: {
user: userReducer,
},
});
userSlice.js
import { createSlice } from "@reduxjs/toolkit";
export const userSlice = createSlice({
name: "user",
initialState: {
user: null,
},
reducers: {
login: (state, action) => {
state.user = action.payload;
},
logout: (state) => {
state.user = null;
},
},
});
export const { login, logout } = userSlice.actions;
export const selectUser = (state) => state.user.user;
export default userSlice.reducer;
解决方案
根据我的口味,您应该从呼叫主体dispatch
获取有关成功登录的信息。您当前正在做的是调度呼叫结果(没有从 中返回)。then
axios
login
undefined
login
这是关于调度如何工作的 redux 文档的链接:https ://react-redux.js.org/api/hooks#usedispatch
编辑
假设我们仍然使用原始代码,如果你做了类似的事情,一切都应该正常:
login_component.js
// import
>>> import { login as loginAction } from '<PATH_TO_USERSLICE.JS>' <<<
// where the login function is declared
const login = (event) => {
axios
.post("http://localhost:8000/login", {
LoginID: LoginID,
Password: Password,
})
.then((response) => {
console.log(response.data.result[0]);
if (response.data.message) {
setLoginStatus(response.data.message);
} else {
setLoginStatus(response.data[0].UserFullName);
setEmail(response.data.result[0].UserEmailID);
setLogID(response.data.result[0].LoginID);
setId(response.data.result[0].UserID);
>>> dispatch(loginAction(response.data.user[0])); <<<
}
});
};
免责声明实际上并没有运行它,但这应该可以。
推荐阅读
- angular - 角度单元测试:无法读取未定义问题的属性“订阅”
- java - SpringBoot 应用程序在 WLS12c/Java8/RHEL fedora7.5 中失败,无法读取架构文档 http://www.springframework.org/schema/beans/spring-beans.xsd
- go - 无法使用自制软件在 mac 上安装特定版本的 go
- c# - 使用 selenium C# 运行时网页不显示任何内容
- python - 使用 pandas 组合工作表,遍历特定列,将行添加到新列表
- java - 为什么每次更改初始屏幕时我的应用程序都会从后台打开?
- database - 存储去年的每月分析数据
- python-3.x - 按给定条件过滤数据框
- bootstrap-4 - 引导程序中的嵌套图像
- python - CV2 imwrite 生成无法打开的图像