代码之家  ›  专栏  ›  技术社区  ›  abhay

仅当我刷新页面时读取道具数据

  •  1
  • abhay  · 技术社区  · 5 年前

    我正在使用功能组件的React。当我登录时,我使用 history.push('/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 };
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   Louis Coulet    5 年前

    在渲染SidebarTopA时,配置文件信息似乎不可用。
    我建议你保护它,并摆脱它。
    将此项添加到SidebarTopA中,位于现有报税表之上(并去掉forceRefresh):

    if(!authentication.user || !authentication.user.user || !authentication.user.user.profile){
        return "Loading user profile, please wait..."
    }
    
        2
  •  0
  •   abhay    5 年前

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

    我的店铺设置是:

    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')
    );