Mal*_*eus 2 authentication token local-storage reactjs react-hooks
我正在尝试登录用户,并使用用户数据更新我的全局上下文。为了让用户保持登录状态,我将他们的数据存储在本地存储中。
我使用反应钩照顾的状态,因此,我已经定义了一个状态:let [userData, setUserData] = useState({});。
因为我不想让用户保持登录状态,所以我在登录期间将他们的数据存储在本地存储中。这有效并且数据实际上存储在本地存储中。
然而,我的问题是我无法将初始userData状态设置为等于本地存储中的当前数据。换句话说,userData状态在重新加载时重置为默认值。
我认为从本地存储获取初始数据并将其分配给useEffect钩子内的状态会起作用。但是在调用setUserDatainside时状态不会更新useEffect。
AuthContext.js:
import React, { createContext, useState, useEffect } from 'react';
export const AuthContext = createContext();
const AuthContextProvider = props => {
let [userData, setUserData] = useState({});
const loginUser = (data) => {
localStorage.setItem('userData', JSON.stringify({
key: data.key,
id: data.id,
email: data.email,
first_name: data.first_name,
last_name: data.last_name
})); // Save the user object in local storage
setUserData({
key: data.key,
id: data.id,
email: data.email,
first_name: data.first_name,
last_name: data.last_name
}); // Set user data
};
const logoutUser = () => {
localStorage.removeItem('userData');
setUserData({}); // Empty user data state
newToast('Successfully signed out');
};
useEffect(() => {
const localUser = JSON.parse(localStorage.getItem('userData'));
if (localUser && localUser.key) {
setUserData({
key: localUser.key,
id: localUser.id,
email: localUser.email,
first_name: localUser.first_name,
last_name: localUser.last_name
}); // Set user data
}
}, [])
return (
<AuthContext.Provider value={{ userData, loginUser, logoutUser, newToast }}>
{props.children}
</AuthContext.Provider>
)
}
export default AuthContextProvider;
Run Code Online (Sandbox Code Playgroud)
登录.js:
const Signin = props => {
let [loading, setLoading] = useState(false);
let [formError, setFormError] = useState(false);
const { userData, loginUser, newToast } = useContext(AuthContext);
const { register, handleSubmit, errors, setError, clearError } = useForm();
const onSubmit = e => {
setLoading(true);
setFormError(false);
clearError(); // Clear all erros on form
axios
.post('users/auth/login/', {
headers: { 'Content-Type': 'application/json' },
email: `${e.email}`,
password: `${e.password}`,
})
.then(res => {
const { data } = res
loginUser(data);
newToast('Successfully signed in');
})
.catch((error) => {
const { data } = error.response;
console.log(data);
data.email && setError("email", "", data.email);
data.password1 && setError("password", "", data.password1);
setFormError(true);
})
setLoading(false);
};
return ( ... );
}
Run Code Online (Sandbox Code Playgroud)
所以我想出了一个解决方案!
在 AuthContext.js 中,我不需要在useEffect. 相反,我在定义状态挂钩时直接获取初始数据:
const localUser = JSON.parse(localStorage.getItem('userData')) || {};
let [userData, setUserData] = useState(localUser);
Run Code Online (Sandbox Code Playgroud)
这样我就根本不需要useEffect钩子了。
我希望这是推荐的方法。
| 归档时间: |
|
| 查看次数: |
5334 次 |
| 最近记录: |