Я вижу две проблемы в вашем коде.
Первая - это синтаксическая ошибка в вашем Home
компоненте:
// ...
if (isFetching && isSuccess && cities && content && restaurantsGroupedBySity && page) {
// HERE IS SYNTAX ERROR, did you copy your code correctly?
return (
} else {
// ...
Вторая - mapDispatchToProps, почему вы этого не сделалиэто согласно документации . Я не вижу ваших создателей действий, но обычно это должно быть примерно так:
const mapDispatchToProps = (dispatch, ownProps) => {
return {
getCities: (/* action creator args, if any */) =>
dispatch(getCities(/* action creator args, if any */)),
pageContent: (/* action creator args, if any */) =>
dispatch(pageContent(/* action creator args, if any */)),
getRestaurantsGroupedByCity: (/* action creator args, if any */) =>
dispatch(getRestaurantsGroupedByCity(/* action creator args, if any */)),
};
}
или, что еще лучше, не используйте mapDispatchToProps, просто вставьте объект во второй аргумент connect :
export default connect(
mapStateToProps,
{getCities, pageContent, getRestaurantsGroupedByCity}
)(Home)
РЕДАКТИРОВАТЬ (после добавления исходного кода создателей действий):
Поскольку вы используете создателей асинхронных действий, вы должны добавить redux-thunk
(или redux-saga), но это проще для начинающих) промежуточное программное обеспечение для вашей конфигурации Redux. Затем вам следует переписать создателей действий следующим образом (см. Подробности в документации redux-thunk ):
import axios from 'axios';
export const getCities = () => (
(dispatch) => {
let citiesQuery = '/api/get/cities';
axios.all([
axios.get(citiesQuery)
]).then(axios.spread((cities) => {
return dispatch({type: "GET_CITIES_FULFILLED", payload: {cities: cities.data}})
})).catch(err => {
return dispatch({type: "GET_CONTENT_REJECTED", payload: err})
});
return dispatch({type: "GET_CONTENT_PENDING"})
}
)
export const getRestaurantsGroupedByCity = () => (
(dispatch) => {
let restaurantsQuery = '/api/get/restaurants-group-by-city';
axios.all([
axios.get(restaurantsQuery),
]).then(axios.spread((response) => {
return dispatch({
type: "GET_RESTO_GROUP_BY_CITY_FULFILLED",
payload: {restaurantsGroupedBySity: response.data}
})
})).catch(err => {
return dispatch({type: "GET_CONTENT_REJECTED", payload: err})
});
return dispatch({type: "GET_CONTENT_PENDING"})
}
)
Улучшения читаемости:
Попробуйте использовать деструктуризацию объектов, ваш код будет более читабельным (и более коротким).
Home (верхняя часть)
Это:
var cities = this.props.homeState.cities;
var content = this.props.homeState.content;
var isSuccess = this.props.homeState.isSuccess;
var isFetching = this.props.homeState.isFetching;
var page = this.props.homeState.page == "/home";
var restaurantsGroupedBySity = this.props.homeState.restaurantsGroupedBySity;
if (isFetching && isSuccess && cities && content && restaurantsGroupedBySity && page) {
var cities = this.props.homeState.cities;
var content = this.props.homeState.content;
var isSuccess = this.props.homeState.isSuccess;
var isFetching = this.props.homeState.isFetching;
var page = this.props.homeState.page == "/home";
var restaurantsGroupedBySity = this.props.homeState.restaurantsGroupedBySity;
можно записатькак это:
const {homeState} = this.props;
const {cities, content, isSuccess, isFetching, page, restaurantsGroupedBySity} = homeState;
const isPage = page == "/home"; // I suggest to use '===' operator here
if (isFetching && isSuccess && cities && content && restaurantsGroupedBySity && isPage) {
// you should not declare the same variables here again,
// the whole this.props is readonly in whole component and will not change
// (if so there is an error somewhere)