reactjs - 为什么我的道具没有被传递给我的子组件?
问题描述
我正在尝试在 React 中创建一个模式,当单击button
in时显示一些信息App.js
。
当我将模态代码放入时App.js
,它成功地填充了数据(尽管一次为每个 li )。
我将模态移动到它自己的组件,但我得到了Cannot read property 'name' of undefined
.
这是我的 App.js 代码:
const APIURL = 'https://api.openbrewerydb.org/breweries?';
const citySearch = 'by_city=boston';
class App extends Component {
constructor(props) {
super(props)
this.handleShow = this.handleShow.bind(this);
this.handleClose = this.handleClose.bind(this);
this.state = {
error: null,
isLoaded: false,
breweries: [],
show: false
};
}
handleClose() {
this.setState({ show: false });
}
handleShow() {
this.setState({ show: true });
}
componentDidMount() {
fetch(APIURL + citySearch)
.then(res => res.json())
.then(
(result) => {
this.setState({
isLoaded: true,
breweries: result
});
},
(error) => {
this.setState({
isLoaded: true,
error
});
}
)
}
render() {
const { error, isLoaded, breweries } = this.state;
if (error) {
return <div>Error: {error.message}</div>;
} else if (!isLoaded) {
return <div>Loading...</div>;
} else {
return (
<div>
<ul>
{breweries.map(brewery => (
<div className="brewery-card">
<li key={brewery.id}>
<p id="brewery-name">{brewery.name}</p>
<p id="brewery-type">{brewery.brewery_type}</p>
<p id="brewery-address">{brewery.street} {brewery.city}, {brewery.state} {breweries.postal_code} </p>
<button onClick={this.handleShow}>Details</button>
<a href={brewery.website_url} target="_blank" rel="noopener noreferrer">Visit Site</a>
</li>
</div>
))}
</ul>
<DetailsModal props={this.props.brewery} show={this.state.modalShow} />
</div>
);
}
}
}
export default App;
这是我的组件代码,它没有收到道具:
import React, { Component } from 'react';
import { Modal, Button } from 'react-bootstrap'
class DetailsModal extends Component {
constructor(props) {
super(props);
this.state = {
show: false
};
}
render() {
const brewery = this.props.brewery;
return (
<Modal {...this.props}>
<Modal.Header closeButton>
<Modal.Title>{brewery.name}</Modal.Title>
</Modal.Header>
<Modal.Body>{brewery.street} {brewery.city}, {brewery.state} {brewery.postal_code}</Modal.Body>
<Modal.Footer>
<Button variant="secondary" onClick={this.handleClose}>
Close
</Button>
</Modal.Footer>
</Modal>
)
}
}
export default DetailsModal;
我错过了什么阻止道具App.js
被用于DetailsModal.js
?
解决方案
您传递的道具名称错误(或访问错误)
这个
<DetailsModal props={this.props.brewery} show={this.state.modalShow} />
应该
// \/ here
<DetailsModal brewery={this.props.brewery} show={this.state.modalShow} />
当你这样做时,const brewery = this.props.brewery;
你试图brewery
从道具访问,但你没有brewery
在道具中提供,只有props
和show
.
这是一个示例来阐明正在发生的事情。
在这里你传递someProp
到ComponentX
里面ComponentX
this.props
将是一个带有传递道具的对象,在这种情况下,它将是
{
someProp: "something"
}
所以this.props.someProp
返回"something"
如果您尝试访问this.props.someOtherProp
它将返回undefined
. 如果你尝试访问this.props.someOtherProp.X
,你会得到一个错误annot read property 'X' of undefined
如果您在理解 props 的工作原理时遇到问题,请查看文档中的示例。
编辑:
您收到错误的另一个原因是 inApp
this.props.brewery
不存在。
只有与您的状态相关brewery
或breweries
处于您状态的事物。
所以这是另一个错误。您需要指定要显示的内容DetailsModal
编辑2:
要在单击时显示啤酒厂,您需要将单击的啤酒厂的值保持在状态并将其传递给模态
添加到
App
状态currentBrewery
this.state = { error: null, isLoaded: false, breweries: [], show: false, currentBrewery: {} };
添加到
onClick
设置currentBrewery
为brewery
从breweries
<button onClick={() => this.handleShow(brewery)}>Details</button>
和
handleShow(brewery) { this.setState({ show: true, currentBrewery: brewery }); }
给你所在州
DetailsModal
的那个currentBrewery
<DetailsModal brewery={this.state.currentBrewery} show={this.state.modalShow} />
推荐阅读
- flutter - 颤振:将文本小部件调整为父级,没有不需要的字体填充
- firebird - 优化存储过程查询
- python-3.x - 如何将 Python Dataframe utc 时间列转换为纪元时间戳?
- sql - 递归查询以查找先前相关的行满足条件
- html - CSS:如何转换 DIV
- 导航项目:悬停?
- r - R中有2个类的频率图
- javascript - 在 gitlab 代码上同步后无法编译并且在文件中但在网页上显示没有错误
- reactjs - 在没有刷新令牌的仅 HTTP cookie 中使用 JWT 进行身份验证
- list - 如何持久化 List 类型的属性
- > 在 JPA 中?
- symfony - 用 phpunit 模拟 symfony 安全,返回空值而不是布尔值(不使用预言)