javascript - 页面刷新时反应为空状态
问题描述
我创建了一个 auth reducer
import * as actionType from '../constants/actionTypes';
const authReducer = (state = { authData: null }, action) => {
switch (action.type) {
case actionType.AUTH:
localStorage.setItem('profile', JSON.stringify({ ...action?.data }));
return { ...state, authData: action.data, loading: false, errors: null };
case actionType.SET_USER:
return { ...state, authData: action.data, loading: false, errors: null };
case actionType.LOGOUT:
localStorage.clear();
return { ...state, authData: null, loading: false, errors: null };
default:
return state;
}
};
export default authReducer;
我为此创建了一组动作
import { AUTH,LOGOUT } from '../constants/actionTypes';
import * as api from '../api/index.js';
export const signin = (formData, router) => async (dispatch) => {
try {
console.log(formData);
const { data } = await api.signIn(formData);
dispatch({ type: AUTH, data });
console.log(JSON.parse(localStorage.getItem('profile')));
router.push('/');
} catch (error) {
console.log(error);
}
};
export const signup = (formData, router) => async (dispatch) => {
try {
console.log(formData);
const { data } = await api.signUp(formData);
dispatch({ type: AUTH, data });
router.push('/');
} catch (error) {
console.log(error);
}
};
export const signout = (router) => async(dispatch) => {
try {
dispatch({ type: LOGOUT });
localStorage.clear()
router.push('/');
} catch (error) {
console.log(error);
}
}
我的主要 app.js
export default function App() {
const user = useSelector((state) => state.auth)
const currUser = user?.authData?.result;
const classes = useStyles();
return (
<Box sx={{ display: 'flex' }}>
<PassPropsToNormalComponents currUser={currUser}>
<Minidrawer/>
<Navigation/>
</PassPropsToNormalComponents>
</Box>
);
}
问题在于上述方法,我正在登录并且auth reducer 正在按预期填充用户数据并且应用程序工作正常但是当我刷新应用程序时,auth reducer 被重置为 null
这就是我尝试过的,我创建了一个额外的 reducer & action,将用户数据设置为 auth 并在 App.js 中调用它
新的 app.js
export default function App() {
const dispatch = useDispatch();
const location = useLocation();
React.useEffect(() => {
const localUserData = JSON.parse(localStorage.getItem('profile'))
dispatch(setCurrentUser(localUserData))
console.log(JSON.parse(localStorage.getItem('profile')));
},[location])
const user = useSelector((state) => state.auth)
const currUser = user?.authData?.result;
const classes = useStyles();
return (
<Box sx={{ display: 'flex' }}>
<PassPropsToNormalComponents currUser={currUser}>
<Minidrawer/>
<Navigation/>
</PassPropsToNormalComponents>
</Box>
);
}
新动作
export const setCurrentUser = (data) => async(dispatch) => {
try {
console.log("ssssssssss");
dispatch({ type: SET_USER, payload:data });
} catch (error) {
console.log(error);
}
}
新的额外减速器
case actionType.SET_USER:
return { ...state, authData: action.data, loading: false, errors: null };
使用这种方法没有任何工作,登录本身不起作用,商店中的身份验证总是为空
解决方案
推荐阅读
- c#-4.0 - 如何从 SharePoint.Client.ListItemCollection C# 中删除行
- android - Theme.AppCompat.Light.DarkActionBar 的默认文本颜色是什么?
- r - R中光栅像素值的描述性和推断性统计
- mongodb - 如何从对象数组中仅获取一个对象?
- python - Python - Tkinter - 使用 after 方法和控制帧速率
- microsoft-graph-api - 通过客户端凭据流进行图形身份验证 - 我的应用程序只能访问我的用户帐户还是访问整个组织?
- matlab - 高频数据matlab上的特征选择
- php - 在 PHP 中使用内部连接求和
- button - JavaFX TableView 填充数组的按钮
- javascript - 所见即所得的文本区域编辑器土耳其语字符显示