javascript - 在 React Context API 和 Redirect 中保存 API 响应
问题描述
在获取电子邮件和密码后的登录页面中,我通过Axios
post
请求发送它们以验证并生成一个JWT web token
,并使用该令牌调用另一个Axios
get
请求以获取一些数据(包)。为此,我使用了链接,所有这些都发生在handleSubmit
. 我也曾经context api
保存所有 API 响应,然后在不同的页面上使用它。但是在提交表单数据后,我在控制台日志中得到了响应,但packs
没有设置为我通过第二个Axios
请求中的调度调用的有效负载。虽然loggedIn
设置为true
但packs
正在返回undefined
。它应该包含 3 个对象的数组。我也用过Redirect
fromreact-router-dom
和 if the loggedIn
istrue
(提交表格后)它应该带我到主页或{/}
. 它也不起作用。点击提交后的 API Response
登录.js
const [{ packs, loggedIn }, dispatch] = useAppContext();
console.log(packs);
console.log(loggedIn);
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const handleSubmit = (e) => {
e.preventDefault();
const data = {
email: email,
password: password,
};
axios
.post("https://playtoshi.totafantasy.com/api/auth/login", data)
.then((res) => {
localStorage.setItem("token", res.data.token);
return axios.get("https://playtoshi.totafantasy.com/api/packs").then(
(res) => console.log(res),
dispatch({
type: "GET_DATA",
packs: res.data.packs,
loggedIn: true,
})
);
})
.catch((err) => console.log(err));
if (loggedIn) return <Redirect to={"/"} />;
};
return (
<div className="login__container">
<form className="login__form" onSubmit={handleSubmit}>
<h3>Sign In</h3>
<div className="form-group">
<label>Email address</label>
<input
type="email"
className="form-control"
placeholder="Enter email"
required
onChange={(e) => setEmail(e.target.value)}
/>
</div>
<div className="form-group">
<label>Password</label>
<input
type="password"
className="form-control"
placeholder="Enter password"
required
onChange={(e) => setPassword(e.target.value)}
/>
</div>
<div className="form-group">
<div className="custom-control custom-checkbox">
<input
type="checkbox"
className="custom-control-input"
id="customCheck1"
style={{ marginRight: "5px" }}
/>
<label className="custom-control-label" htmlFor="customCheck1">
Remember me
</label>
</div>
</div>
<button type="submit" className="btn btn-primary btn-block">
Submit
</button>
<p className="forgot-password text-right">
Forgot <a href="/">password?</a>
</p>
</form>
</div>
);
}
export default Login;
减速器.js
export const initialState = {
packs: [],
loggedIn: false,
};
export const reducer = (state, action) => {
switch (action.type) {
case "GET_DATA":
return {
...state,
packs: action.packs,
loggedIn: true,
};
default:
return { ...state };
}
};
上下文.js
import React, { createContext, useContext, useReducer } from "react";
export const AppContext = createContext();
export const Context = ({ initialState, reducer, children }) => {
return (
<AppContext.Provider value={useReducer(reducer, initialState)}>
{children}
</AppContext.Provider>
);
};
export const useAppContext = () => useContext(AppContext);
解决方案
推荐阅读
- angular - 如何回到正确的页面
- javascript - VueJS从数字变格
- android - 如何以随机顺序对 Room 数据库进行分页?
- java - Android:是否可以将两个全屏片段链接到一个活动(只使用一个,但选择正确的一个有逻辑)?
- javascript - 在 Apache 服务器上使用带有 GZipped json 文件的 JQuery $.getJSON
- python - 未输入标签(Django)
- azure-data-explorer - Azure 数据资源管理器数据连接数据格式
- cybersource - 如何更新 Flex 令牌的计费信息?
- python - 如何比较两个不同 CSV 文件的第 4 列以检查它们是否相同?
- plugins - 只有括号和其他不包含对程序员有意义的信息的标记的行现象有名称吗?