Обработка глубоко вложенных данных в компонентах React - PullRequest
1 голос
/ 20 марта 2019

Я столкнулся с дилеммой в моих компонентах, когда данные, к которым я пытаюсь получить доступ, еще не "существуют". Например, когда я регистрирую свои редукционные действия, я получаю следующее: enter image description here enter image description here

Первое изображение - это то, как мои данные выглядят во время загрузки, второе изображение - то, как мои вложенные данные выглядят полученными.

Из-за этого мне приходится запускать проверки внутри метода рендеринга моих компонентов, например:

const data = homepage.upcomingTrips.data.upcoming_hikes;
{ !loading && data && data.upcoming_hikes &&
    ...more code here
}

_reducers / Главная / upcoming_trips.reducer.js:

import { homepageConstants } from '../../_constants';

export function upcomingTrips(state = {}, action) {

switch (action.type) {
    case homepageConstants.UPCOMING_TRIPS_REQUEST:
        return {
            data: {},
            loading: true,
        };
    case homepageConstants.UPCOMING_TRIPS_SUCCESS:
        return {
            data: action.data,
            loading: false,
        };
    case homepageConstants.UPCOMING_TRIPS_FAILURE:
        return {
            error: action.error,
        };

    default:
        return state;
    }
}

_reducers / Главная / index.js:

import { combineReducers } from 'redux';

import { currentPack } from './current_pack.reducer';
import { totalMiles } from './total_miles.reducer';
import { upcomingTrips } from './upcoming_trips.reducer';

const homepage = combineReducers({
    currentPack,
    totalMiles,
    upcomingTrips,
});

export default homepage;

_reducers / index.js

import { combineReducers } from 'redux';

import { authentication } from './authentication.reducer';
import { registration } from './registration.reducer';
import { users } from './users.reducer';
// import { homepageData } from './homepage.reducer';
import homepage from './homepage';
import { explorepageData } from './explorepage.reducer';
import { alert } from './alert.reducer';

const rootReducer = combineReducers({
  authentication,
  registration,
  users,
  homepage,
  explorepageData,
  alert
});

export default rootReducer;

UpcomingTrips.jsx:

class UpcomingTrips extends Component {

    componentDidMount() {
        this.props.getUpcomingTrips();
    }

    render() {
        const { classes, homepage } = this.props;
        const data = homepage.upcomingTrips.data.upcoming_hikes;
        const loading = homepage.upcomingTrips.data.loading;
        console.log('homepage: ', homepage.upcomingTrips.data.upcoming_hikes);

        return (
            <UpcomingTripStyles>
                <Typography variant='h4' className={ `${ classes.headline } ${ classes.widgetName }` }>
                    Upcoming Trips
                </Typography>
                { loading && <img src='/static/loading.svg' alt='loading' className='loading-img' /> }
                <ul className='upcoming-hikes'>
                    { !loading && data && data.upcoming_hikes &&
                        data.upcoming_hikes.map((h) =>
                            <li className='hike-item' key={ h.id }>
                            <span className='start-date'>{ toDate(h.start_date) }</span>
                            <span className='hike-name'>{ h.name }</span>
                            </li>,
                        )
                    }
                    { !loading && data && !_.toArray(data.upcoming_hikes).length &&
                        <p>You haven't created any Upcoming Hikes yet!</p>
                    }
                </ul>
            </UpcomingTripStyles>
        );
    }
}

function mapStateToProps(state) {
    const { homepage } = state;
    return {
        homepage,
    };
}

const mapDispatchToProps = dispatch => {
    return {
        getUpcomingTrips: () => {
            dispatch(homepageActions.getUpcomingTrips())
        }
    };
};

const enhance = compose(
    connect(mapStateToProps, mapDispatchToProps),
    withStyles(styles),
);

const connectedUpcomingTrips = enhance(UpcomingTrips);
export { connectedUpcomingTrips as UpcomingTrips };

Так, каков лучший способ справиться со всем этим? Должен ли я посмотреть на выравнивание моих данных с помощью чего-то вроде Normalizr? Или это больше связано с тем, как работают мои редукторы?

...