Я извлекаю «комментарии» массива из массива объектов, и когда я пытаюсь передать этот массив функции, я получаю эту ошибку «Не удается прочитать комментарии свойства неопределенного»
вот фрагмент моего кода.
export const DISHES = [
{
id: 0,
name: "Uthappizza",
image: "assets/images/uthappizza.png",
category: "mains",
label: "Hot",
price: "4.99",
comments: [
{
id: 0,
rating: 5,
comment: "Imagine all the eatables, living in conFusion!",
author: "John Lemon",
date: "2012-10-16T17:57:28.556094Z"
},
{
в основном классе мне удалось получить из массива БЛЮДА нужный элемент
import { DISHES } from "../shared/dishes";
class Main extends Component {
constructor(props) {
super(props);
this.state = {
dishes: DISHES,
selectedDish: null
};
}
onDishSelect(dishId) {
this.setState({
selectedDishId: dishId
});
}
render() {
return (
<DishDetail
dish = {
this.state.dishes.filter(
dish => dish.id === this.state.selectedDishId
)[0]
}
);
}
}
здесь я попытался разобрать «комментарии», но я не смог даже передать его функции «renderComments», но когда я пытаюсь передать «this.props.dish», он работает нормально
class DishDetail extends Component {
constructor(props) {
super(props);
this.renderComments = this.renderComments.bind(this);
}
renderComments(comments) {
return (
.....
);
}
render() {
return (
<div className = "col-12 col-md-5 m-1">
/*here is the problem*/
{this.renderComments(this.props.dish.comments)}
</div>
);
}
}
не может быть, вокруг этого есть html
вам нужно установить реквизиты по умолчанию и требуемые типы, потому что вы можете передать пустой массив
import PropTypes from 'prop-types';
DishDetail.propTypes = {
dish: PropTypes.object
};
DishDetail.defaultProps = {
dish: {
id: 0,
name: "Uthappizza",
image: "assets/images/uthappizza.png",
category: "mains",
label: "Hot",
price: "4.99",
comments: [
{
id: 0,
rating: 5,
comment: "Imagine all the eatables, living in conFusion!",
author: "John Lemon",
date: "2012-10-16T17:57:28.556094Z"
}
]
}
блюдо, переданное в DishDetails, является всего лишь одним объектом из массива, поэтому нет необходимости делать его блюдо[0]
вы правы, я не заметил, во всяком случае, вы можете передать пустой объект, и вам нужно установить дефолтные реквизиты, я изменил ответ для объекта
Вы получаете эту ошибку, потому что this.state.selectedDishId
— это undefined
, и поэтому filter
не находит соответствия.
Вы можете добавить проверку перед использованием функции renderComments, как показано ниже:
this.props.dish && this.renderComments(this.props.dish.comments)
Код компонента
import React, { Component } from 'react';
class DishDetail extends Component {
constructor(props) {
super(props);
this.renderComments = this.renderComments.bind(this);
}
renderComments(comments) {
return comments.map((comment)=> {
return(
<p>
{comment.comment}
</p>
)
})
}
render() {
return (
<div className = "col-12 col-md-5 m-1">
{this.props.dish && this.renderComments(this.props.dish.comments)}
</div>
);
}
}
export default DishDetail;
вот полный стекблиц
Ссылка :
вы не обрабатывали нулевое значение, которое вы должны написать
class DishDetail extends Component {
constructor(props) {
super(props);
this.renderComments = this.renderComments.bind(this);
}
renderComments(comments) {
return (
.....
);
}
render() {
if (this.props.dish!=null)
{
return (
<div className = "col-12 col-md-5 m-1">
/*here is the problem*/
{this.renderComments(this.props.dish.comments)}
</div>
);
}
else
{
<div></div>
}
}
}
вы можете просто сделать это,
<div className = "col-12 col-md-5 m-1">
<h4>Comments</h4>
{this.renderComments(this.props.dish)}
</div>
а потом
renderComments(dish) {
if (dish != null) {
const commentsList = dish.comments.map((comment) => {
return (
<div key = {comment.id}>
<list className = "list-unstyled" tag = "list">
<li className = "mb-2">{comment.comment}</li>
<li className = "mb-5">-- {comment.author}, {this.dateConverter(comment.date)}</li>
</list>
</div>
);
});
return commentsList;
}
else {
return (
<div></div>
)
}
}
Я столкнулся с той же проблемой. Попробовал это, и это сработало.
Вы должны добавить, почему это решает проблему, а не только то, что она решает проблему.
Я думаю, вы должны удалить фигурные скобки.