#reactjs #react-redux #redux-thunk
Вопрос:
Я новичок в Redux, изучающий полный курс Coursera. Я пытаюсь передать реквизиты дочернему компоненту Home и DishDetail, но сталкиваюсь с проблемой «не удается прочитать фильтр свойств неопределенного». Состояния по умолчанию хранятся в одном из редукторов ./redux/dishes.js
MainComponent.js
import React, {Component} from 'react';
import Menu from './MenuComponent';
import DishDetail from './DishDetailComponent';
import Contact from './ContactComponent';
import Header from './HeaderComponent';
import Footer from './FooterComponent';
import Home from './HomeComponent';
import About from './AboutComponent';
import { Switch, Route, Redirect, withRouter } from 'react-router-dom';
import {connect} from 'react-redux';
import { addComment, fetchDishes } from '../redux/ActionCreators';
const mapStateToProps = state => {
return{
dishes: state.dishes,
comments: state.comments,
promotions: state.promotions,
leaders: state.leaders
}
}
const mapDispatchToProps = (dispatch) => ({
addComment: (dishId, rating, author, comment) => dispatch(addComment(dishId, rating, author, comment)),
fetchDishes: () => {dispatch(fetchDishes())}
})
class Main extends Component {
constructor(props) {
super(props);
}
componentDidMount(){
this.props.fetchDishes();
}
render() {
const HomePage = () => {
return(
<Home
dish={this.props.dishes.dishes.filter((dish) => dish.featured)[0]}
dishesLoading={this.props.dishes.isLoading}
dishesErrMess={this.props.dishes.errMess}
promotion={this.props.promotions.filter((promo) => promo.featured)[0]}
leader={this.props.leaders.filter((leader) => leader.featured)[0]}
/>
);
}
const DishWithId = ({match}) => {
return(
<DishDetail dish={this.props.dishes.dishes.filter((dish) => dish.id === parseInt(match.params.dishId,10))[0]}
isLoading={this.props.dishes.isLoading}
errMess={this.props.dishes.errMess}
comments={this.props.comments.filter((comment) => comment.dishId === parseInt(match.params.dishId,10))}
addComment={this.props.addComment}
/>
);
};
return (
<div className="App">
<Header />
<Switch>
<Route path="/home" component={HomePage} />
<Route exact path="/menu" component={() => <Menu dishes={this.props.dishes} />} />
<Route path="/menu/:dishId" component={DishWithId} />
<Route exact path="/contactus" component={Contact} />
<Route exact path="/aboutus" component={() => <About leaders={this.props.leaders} />} />
<Redirect to="/home" />
</Switch>
<Footer />
</div>
);
}
}
export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Main));
Редуктор dishes.js
import * as ActionTypes from './ActionTypes';
export const Dishes = (state = {
isLoading: true,
errMess: null,
dishes: []
}, action) => {
switch(action.type) {
case ActionTypes.ADD_DISHES:
return {...state, isLoading: false, errMess: null, dishes: action.payload}
case ActionTypes.DISHES_LOADING:
return {...state, isLoading: true, errMess: null}
case ActionTypes.DISHES_FAILED:
return {...state, isLoading: false, errMess: action.payload}
default:
return state;
}
}
Комментарии:
1. Возможно, у этого.props.dishes.dishes нет свойства или метода фильтра. Попробуйте console.log(это.реквизит.блюда.блюда, чтобы узнать, что доступно.
2. Это просто опечатка? должно
this.props.dishes.dishes
бытьthis.props.dishes
? Похоже, именно так вы получаете доступ к нему в другом месте.