React JS只在刷新页面时读取道具数据



我将React与功能组件一起使用。当我登录时,我使用history.push('/dashboard')将用户重定向到仪表板页面。当我在Dashboard页面上执行控制台日志时,它会向我显示props中可用的所有数据。但是数据不会呈现在页面上,它显示"Uncaught (in promise) TypeError: Cannot read property 'profile' of undefined"。当我刷新页面或在历史中使用{ forceRefresh:true }时,一切都很好。

边栏组件:

import React,{useEffect} from 'react';
import { Link,withRouter } from 'react-router-dom';
import { connect } from 'react-redux';
import { userActions } from '../../../_actions/users'
import {
Sidebar,
UncontrolledButtonDropdown,
Avatar,
AvatarAddOn,
DropdownToggle,
DropdownMenu,
DropdownItem
} from './../../../components';
function SidebarTopA(props) {
const { authentication } = props
function logout(){
return (e)=>props.logout()
}
return (
<React.Fragment>
{ /* START: Sidebar Default */}
<Sidebar.HideSlim>
<Sidebar.Section className="pt-0">
<Link to="/" className="d-block">
<Sidebar.HideSlim>
<Avatar.Image
size="lg"
src={authentication.user.user.profile.profile_photo}
addOns={[
<AvatarAddOn.Icon
className="fa fa-circle"
color={authentication.loggedIn ? "success" :"warning"}
key="avatar-icon-fg"
/>
]}
/>
</Sidebar.HideSlim>
</Link>
<UncontrolledButtonDropdown>
<DropdownToggle color="link" className="pl-0 pb-0 btn-profile sidebar__link">
{authentication.user.user.first_name} {authentication.user.user.last_name}
<i className="fa fa-angle-down ml-2"></i>
</DropdownToggle>
<DropdownMenu persist>
<DropdownItem header>
{authentication.user.user.email}
</DropdownItem>
<DropdownItem divider />
<DropdownItem tag={Link} to="/apps/profile-details">
<i className="fa fa-fw fa-user mr-2"></i>
Your Profile
</DropdownItem>
<DropdownItem divider />
<DropdownItem tag={Link} to="/" onClick={logout()}>
<i className="fa fa-fw fa-sign-out mr-2"></i>
Sign Out
</DropdownItem>
</DropdownMenu>
</UncontrolledButtonDropdown>
<div className="small sidebar__link--muted">
{authentication.user.user.profile.job_title}
</div>
</Sidebar.Section>
</Sidebar.HideSlim>
{ /* END: Sidebar Default */}
{ /* START: Sidebar Slim */}
<Sidebar.ShowSlim>
<Sidebar.Section>
<Avatar.Image
size="sm"
src={authentication.user.user.profile.profile_photo} 
addOns={[
<AvatarAddOn.Icon
className="fa fa-circle"
color="white"
key="avatar-icon-bg"
/>,
<AvatarAddOn.Icon
className="fa fa-circle"
color="success"
key="avatar-icon-fg"
/>
]}
/>
</Sidebar.Section>
</Sidebar.ShowSlim>
{ /* END: Sidebar Slim */}
</React.Fragment>
);
}
function mapState(state) {
const { authentication } = state
return { authentication };
}
const actionCreators = {
logout: userActions.logout
}
const connectedHomePage = withRouter(connect(mapState, actionCreators)(SidebarTopA));
export { connectedHomePage as SidebarTopA };

在渲染SidebarTopA时,配置文件信息似乎不可用
我建议您保护它,并删除forceRefresh
将其添加到SidebarTopA中,在您现有的退货上方(并取消forceRefresh(:

if(!authentication.user || !authentication.user.user || !authentication.user.user.profile){
return "Loading user profile, please wait..."
}

最后,我使用redux-persistent包解决了这个问题。

我的商店设置为:

import { createStore, applyMiddleware } from 'redux';
import thunkMiddleware from 'redux-thunk';
import { createLogger } from 'redux-logger';
import rootReducer from '../_reducers';
import { composeWithDevTools  } from 'redux-devtools-extension';
import { persistStore, persistReducer } from 'redux-persist'
import storage from 'redux-persist/lib/storage'
const persistConfig = {
key: 'chedsk',
storage,
}
const loggerMiddleware = createLogger();
const persistedReducer = persistReducer(persistConfig, rootReducer)

const composeEnhancers = composeWithDevTools({trace: true, traceLimit: 20});
export const store = createStore(
persistedReducer,composeEnhancers( applyMiddleware(
thunkMiddleware,
loggerMiddleware
))

)
export const persistor = persistStore(store)

在应用程序组件我做。

import { store, persistor } from './_helpers/store';
import { PersistGate } from 'redux-persist/integration/react'
render(
<Provider store={store}>
<PersistGate loading={null} persistor={persistor}>
<App />
</PersistGate>
</Provider>,
document.querySelector('#root')
);

相关内容

  • 没有找到相关文章

最新更新