因此,在我登录我的应用程序后,令牌被保存在本地存储中,并且用户对象从存储的令牌中解码。因此,用户对象将是这样的:
{
name: '',
avatar: {},
bio: '',
and many others,
....,
}
我创建了一个负责身份验证工作的reducer和一个负责用户个人资料的reducer。所以根减速器看起来像这样:
export const RootReducer = combineReducers({
auth: authReducer,
profile: profileReducer,
});
在那之后,我在商店中添加了初始值,以便还原器状态得以持久。看起来像这样:
const loggedUserToken = localStorage.getItem('token');
const loggedUser = JSON.parse(localStorage.getItem('loggedUser'));
const store = createStore(
RootReducer,
{
auth: {
authenticated: loggedUserToken,
loggedUser,
isLoggedIn: false,
errorMessage: '',
},
profile: {
bio: loggedUser.bio,
avatar: loggedUser.avatar,
},
},
composeWithDevTools(applyMiddleware(...middlewares))
);
问题是,当我打开应用程序时出现此错误:
TypeError: Cannot read property 'bio' of null
然后,如果我从配置文件密钥中注释了bio和avatar行,则错误消失,并且再次显示带有注册和登录的主屏幕。然后,当我登录时出现此错误:
TypeError: Cannot read property 'type' of undefined
(anonymous function)
F:/dev/Friendist_Complete_/client/src/components/navbar/Navbar.jsx:47
44 | <Link to='/profile'>
45 | <div className="App_avatar_medalion">
46 | <img
> 47 | src={`data:${avatar.type};base64, ${avatar.thumb}`}
| ^ 48 | alt={avatar.name}
49 | />
50 | </div>
,然后在取消对bio和avatar这两行的注释后,错误消失了,此时一切正常,我可以按预期更新所有内容。甚至更奇怪的是,如果我退出但不刷新页面,然后重新登录,则可以使用,但是如果我退出并刷新页面并再次登录,则上面的所有错误都会重新出现。
据我所知,所有这一切都是因为redux存储中的配置文件对象最初并未填充,但应该填充,因为我直接从登录的用户属性中对其进行了保湿。
我想,我的问题是如何在登录时立即填充redux存储中的初始属性,以及如何使它们即使在刷新页面后也保持填充状态。
如果问题不太清楚,我深表歉意,这是因为我不太了解问题到底是什么。