Вы передаете реквизиты с неправильным именем (или неправильно обращаетесь к нему)
Это
<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
Если у вас возникли проблемы, чтобы понять, как работает реквизит, пожалуйста, посмотрите examples из документации.
Редактировать:
Другая причина, по которой вы получаете ошибку, состоит в том, что в App
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} />