reactjs - React - 将信息传递到组件中,呈现为 null
问题描述
我不知何故破坏了我的工作 React 代码,我不知道为什么。我是学习 React 的新手,到目前为止,我修复它的所有尝试都没有根据,而且我可能把它弄得更糟。
我有 4 张“菜单”卡。当您单击菜单卡时,左下角会弹出一个新卡,其中包含有关该菜单项的一些附加信息,以及右下角有关该菜单项的评论。
我有一个 DishDetail 组件,它呈现该 selectedDish 信息。组件安装和渲染,但我的 disdetail 渲染为 null
我的主组件渲染了 Menu 组件和 discretail 组件:
import React, { Component } from 'react';
import { Navbar, NavbarBrand } from 'reactstrap';
import Menu from './MenuComponent';
import DishDetail from './DishdetailComponent';
import { DISHES } from '../shared/dishes';
class Main extends Component {
constructor(props) {
super(props);
this.state = {
dishes: DISHES,
selectedDish: null
};
}
//sets the state of the selected Dish
onDishSelect(dishId) {
this.setState({ selectedDish: dishId});
}
//Renders the page with all its subcomponents
render() {
return (
<div>
<Navbar dark color="primary">
<div className="container">
<NavbarBrand href="/">Ristorante Con Fusion</NavbarBrand>
</div>
</Navbar>
<Menu dishes={this.state.dishes} onClick={(dishId) => this.onDishSelect(dishId)} />
<DishDetail dish={this.state.dishes.filter((dish) => dish.id === this.state.selectedDish)[0]} />
</div>
);
}
}
export default Main;
菜单组件渲染 4 个菜单卡片
import React from 'react';
import { Card, CardImg, CardImgOverlay, CardText, CardBody, CardTitle } from 'reactstrap';
function RenderMenuItem({ dish, onClick }) {
return(
<Card key={dish.id}
onClick={() => props.onClick(dish.id)}>
<CardImg width="100%" src={dish.image} alt={dish.name} />
<CardImgOverlay>
<CardTitle>{dish.name}</CardTitle>
</CardImgOverlay>
</Card>
);
}
const Menu = (props) => {
const menu = props.dishes.map((dish) => {
return (
<div key={dish.id} className="col-12 col-md-5 m-1">
<RenderMenuItem dish={dish} onClick={props.onClick} />
</div>
);
});
//then returns a container of the menu
return (
<div className="container">
<div className="row">
{menu}
</div>
</div>
);
}
export default Menu;
菜品细节组件应该呈现菜单/菜品信息
import React from 'react';
import { Card, CardImg, CardImgOverlay, CardText, CardBody, CardTitle } from
'reactstrap';
function RenderDish({dish}) {
if (dish != null)
return(
<div className="col-12 col-md-5 m-1">
<Card>
<CardImg top src={dish.image} alt={dish.name} />
<CardBody>
<CardTitle>{dish.name}</CardTitle>
<CardText>{dish.description}</CardText>
</CardBody>
</Card>
</div>
);
else
return(
<div>For Some Reason, dish is null</div>
);
}
function RenderComments({comments}){
if (comments != null){
const coms = comments.map((com) => {
return(
<ul key={com.id} className='list-unstyled'>
<li>
{com.comment}
</li>
<li>
-- {com.author}, { }
{
new Intl.DateTimeFormat('en-US', {
month: 'short', day: '2-digit', year: 'numeric'
}).format(new Date(com.date))
}
</li>
</ul>
);
});
return(
<div className="col-12 col-md-5 m-1">
<h4>Comments</h4>
{coms}
</div>
);}
else{
return(
<div>For Some reason, comments are null</div>
);
}
}
const DishDetail = (props) => {
return (
<div className="container">
<div className="row">
<RenderDish dish={props.dish} />
<RenderComments comments={props.comments} />
</div>
</div>
)
}
export default DishDetail;
还有一个文件,其中包含所有单个菜单项的信息。
export const DISHES =
[
{
id: 0,
name:'Uthappizza',
image: 'assets/images/uthappizza.png',
category: 'mains',
label:'Hot',
price:'4.99',
description:'A unique combination of Indian Uthappam (pancake) and Italian pizza, topped with Cerignola olives, ripe vine cherry tomatoes, Vidalia onion, Guntur chillies and Buffalo Paneer.',
comments: [
{
id: 0,
rating: 5,
comment: "Imagine all the eatables, living in conFusion!",
author: "John Lemon",
date: "2012-10-16T17:57:28.556094Z"
},
{
id: 1,
rating: 4,
comment: "Sends anyone to heaven, I wish I could get my mother-in-law to eat it!",
author: "Paul McVites",
date: "2014-09-05T17:57:28.556094Z"
},
{
id: 2,
rating: 3,
comment: "Eat it, just eat it!",
author: "Michael Jaikishan",
date: "2015-02-13T17:57:28.556094Z"
},
{
id: 3,
rating: 4,
comment: "Ultimate, Reaching for the stars!",
author: "Ringo Starry",
date: "2013-12-02T17:57:28.556094Z"
},
{
id: 4,
rating: 2,
comment: "It's your birthday, we're gonna party!",
author: "25 Cent",
date: "2011-12-02T17:57:28.556094Z"
}
] },
{
id: 1,
name:'Zucchipakoda',
image: 'assets/images/zucchipakoda.png',
category: 'appetizer',
label:'',
price:'1.99',
description:'Deep fried Zucchini coated with mildly spiced Chickpea flour batter accompanied with a sweet-tangy tamarind sauce',
comments: [
{
id: 0,
rating: 5,
comment: "Imagine all the eatables, living in conFusion!",
author: "John Lemon",
date: "2012-10-16T17:57:28.556094Z"
},
{
id: 1,
rating: 4,
comment: "Sends anyone to heaven, I wish I could get my mother-in-law to eat it!",
author: "Paul McVites",
date: "2014-09-05T17:57:28.556094Z"
},
{
id: 2,
rating: 3,
comment: "Eat it, just eat it!",
author: "Michael Jaikishan",
date: "2015-02-13T17:57:28.556094Z"
},
{
id: 3,
rating: 4,
comment: "Ultimate, Reaching for the stars!",
author: "Ringo Starry",
date: "2013-12-02T17:57:28.556094Z"
},
{
id: 4,
rating: 2,
comment: "It's your birthday, we're gonna party!",
author: "25 Cent",
date: "2011-12-02T17:57:28.556094Z"
}
]
},
{
id: 2,
name:'Vadonut',
image: 'assets/images/vadonut.png',
category: 'appetizer',
label:'New',
price:'1.99',
description:'A quintessential ConFusion experience, is it a vada or is it a donut?',
comments: [
{
id: 0,
rating: 5,
comment: "Imagine all the eatables, living in conFusion!",
author: "John Lemon",
date: "2012-10-16T17:57:28.556094Z"
},
{
id: 1,
rating: 4,
comment: "Sends anyone to heaven, I wish I could get my mother-in-law to eat it!",
author: "Paul McVites",
date: "2014-09-05T17:57:28.556094Z"
},
{
id: 2,
rating: 3,
comment: "Eat it, just eat it!",
author: "Michael Jaikishan",
date: "2015-02-13T17:57:28.556094Z"
},
{
id: 3,
rating: 4,
comment: "Ultimate, Reaching for the stars!",
author: "Ringo Starry",
date: "2013-12-02T17:57:28.556094Z"
},
{
id: 4,
rating: 2,
comment: "It's your birthday, we're gonna party!",
author: "25 Cent",
date: "2011-12-02T17:57:28.556094Z"
}
]
},
{
id: 3,
name:'ElaiCheese Cake',
image: 'assets/images/elaicheesecake.png',
category: 'dessert',
label:'',
price:'2.99',
description:'A delectable, semi-sweet New York Style Cheese Cake, with Graham cracker crust and spiced with Indian cardamoms',
comments: [
{
id: 0,
rating: 5,
comment: "Imagine all the eatables, living in conFusion!",
author: "John Lemon",
date: "2012-10-16T17:57:28.556094Z"
},
{
id: 1,
rating: 4,
comment: "Sends anyone to heaven, I wish I could get my mother-in-law to eat it!",
author: "Paul McVites",
date: "2014-09-05T17:57:28.556094Z"
},
{
id: 2,
rating: 3,
comment: "Eat it, just eat it!",
author: "Michael Jaikishan",
date: "2015-02-13T17:57:28.556094Z"
},
{
id: 3,
rating: 4,
comment: "Ultimate, Reaching for the stars!",
author: "Ringo Starry",
date: "2013-12-02T17:57:28.556094Z"
},
{
id: 4,
rating: 2,
comment: "It's your birthday, we're gonna party!",
author: "25 Cent",
date: "2011-12-02T17:57:28.556094Z"
}
]
}
];
我认为中断是在 discId 和将该信息传递给 discdetail 组件之间的某个地方,但我不太明白为什么。我是 React 的新手,所以我很难想象/解决这个问题。
解决方案
Fixes are given below.
1. `props.onClick` to `onClick`.
function RenderMenuItem({ dish, onClick }) {
return (
<Card key={dish.id} onClick={() => onClick(dish.id)}>
<CardImg width="100%" src={dish.image} alt={dish.name} />
<CardImgOverlay>
<CardTitle>{dish.name}</CardTitle>
</CardImgOverlay>
</Card>
);
2. `props.comments` to `props.dish.comments`. To avoid first time invalid access of empty `dish` object for comments insert `null` check.
const DishDetail = (props) => {
return (
<div className="container">
<div className="row">
<RenderDish dish={props.dish} />
{props.dish != null && (
<RenderComments comments={props.dish.comments} />
)}
</div>
</div>
);
};
推荐阅读
- amazon-web-services - AWS CodeDeploy 冻结等待终止实例的 CodePipeline 阶段
- angularjs - createUserWithEmailAndPassword 失败:第一个参数“email”必须是有效字符串
- c# - .ToDictionary C# 中的 foreach 和索引
- python - python中的Weblogic日志解析器
- java - Java - Gson 不能使用动态定义的对象
- python - 熊猫选择空行的日期范围不起作用
- javascript - Angular 4中的动态嵌套路由器插座使用
- php - 秒后 Cookie 重定向
- java - 将 ' 替换为 \'
- c# - 背包C#实现任务