【发布时间】:2022-01-12 09:05:02
【问题描述】:
这是我第一次使用 Context API,我对如何将我从 API 接收到的不记名令牌存储在授权标头中感到困惑。我在 YouTube 上看到了一些教程,并尝试将它们应用到我的代码中,但没有取得多大成功。 我将留下我的上下文代码和我的登录名。登录没问题,API调用没问题,就是存储bearer token。
登录.jsx
const handleSubmit = (event) => {
event.preventDefault();
// dispatch({type: "LOGIN_START"})
login({ username, password }, dispatch);
};
{...}
AuthActions.js
export const loginStart = () => ({
type: "LOGIN_START",
});
export const loginSuccess = (user) => ({
type: "LOGIN_SUCCESS",
payload: user,
});
export const loginFailure = () => ({
type: "LOGIN_FAILURE",
});
//logout
export const logout = () => ({
type: "LOGOUT",
});
AuthContext.js
import AuthReducer from "./AuthReducer";
import { createContext, useEffect, useReducer } from "react";
const INITIAL_STATE = {
user: JSON.parse(localStorage.getItem("user")) || null,
isFetching: false,
error: false,
};
export const AuthContext = createContext(INITIAL_STATE);
export const AuthContextProvider = ({ children }) => {
const [state, dispatch] = useReducer(AuthReducer, INITIAL_STATE);
useEffect(() => {
localStorage.setItem("user", JSON.stringify(state.user));
}, [state.user]);
return (
<AuthContext.Provider
value={{
user: state.user,
isFetching: state.isFetching,
error: state.error,
dispatch,
}}
>
{children}
</AuthContext.Provider>
);
};
AuthReducer.js
const AuthReducer = (state, action) => {
switch (action.type) {
case "LOGIN_START":
return {
user: null,
isFetching: true,
error: false,
};
case "LOGIN_SUCCESS":
return {
user: action.payload,
isFetching: false,
error: false,
};
case "LOGIN_FAILURE":
return {
user: null,
isFetching: false,
error: true,
};
case "LOGOUT":
return {
user: null,
isFetching: false,
error: false,
};
default:
return { ...state };
}
};
export default AuthReducer;
回应
{data: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTgwL…MzMX0.rpa4DVG8pERVERks4W9_tknFQUCOvIc3GCZZGbW3HU0', status: 200, statusText: '', headers: {…}, config: {…}, …}
config: {transitional: {…}, transformRequest: Array(1), transformResponse: Array(1), timeout: 0, adapter: ƒ, …}
data: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTgwLCJ1c2VybmFtZSI6InRlc3RlNDUiLCJpYXQiOjE2NDE5NDY3MzEsImV4cCI6MTY0MTk1MDMzMX0.rpa4DVG8pERVERks4W9_tknFQUCOvIc3GCZZGbW3HU0"
headers: {content-length: '170', content-type: 'application/json; charset=utf-8'}
request: XMLHttpRequest {onreadystatechange: null, readyState: 4, timeout: 0, withCredentials: false, upload: XMLHttpRequestUpload, …}
status: 200
statusText: ""
[[Prototype]]: Object
【问题讨论】:
-
似乎您为
AuthContext.js和AuthReducer.js提供了相同的代码