Вот чего я пытаюсь достичь. У меня есть два компонента React Product
и ProductInfoPanel
, показанный внутри компонента ProductList
. Product
отображает выбранную информацию о продукте, такую как название продукта и цена. При щелчке по продукту в окне ProductInfoPanel
будет показано больше деталей. Поэтому мне нужно пройти вау дважды, нажав на ProductInfoPanel
.Реакция: реквизит компонента компонента вне метода рендеринга без использования состояния
Вот как я сейчас соединяю их вместе. Каждый Product
получает обработчик клика, который передает объект product
при вызове, затем он передается в реквизиты ProductInfoPanel
. ProductList
использует состояние, чтобы отслеживать, что было нажато, поэтому, когда он изменяется, он вызывает повторную рендеринг информационной панели.
class ProductList extends React.Component {
render() {
return (
<div>
<div className='content'>
<ul>
{ this.props.products.map((product, index) => {
return (
<li key={index}>
<Product product={product}
clickHandler={this.onProductClicked.bind(this)}/>
</li>
);
})}
</ul>
</div>
<div className='side-panel'>
<ProductInfoPanel product={this.state.selectedProduct} />
</div>
</div>
);
}
onProductClicked(clickedProduct) {
// Use the product object that was clicked, and updates the state.
// This updates the info panel content.
this.setState({ selectedProduct: clickedProduct });
}
}
Вот примерно, как построены два компонента.
class Product extends React.Component {
render() {
// Even though it needs only name and price, it gets the whole product
// object passed in so that it can pass it to the info panel in the
// click handler.
return (
<div onClick={this.onClicked.bind(this)}>
<span>{this.props.product.name}</span>
<span>{this.props.product.price}</span>
</div>
);
}
onClicked(e) {
this.props.clickHandler(this.props.product);
}
}
class ProductInfoPanel extends React.Component {
render() {
// Info panel displays more information about a product.
return (
<ul>
<li>{this.props.product.name}</li>
<li>{this.props.product.price}</li>
<li>{this.props.product.description}</li>
<li>{this.props.product.rating}</li>
<li>{this.props.product.review}</li>
</ul>
);
}
}
Это лучшее, что я мог придумать, но использование состояния для отслеживания того, какой продукт был нажат, по-прежнему звучит неправильно. Я имею в виду, что это не состояние компонента, не так ли?
Если бы я мог обновить props
из ссылочных Реагировать компонент снаружи метода render
, то я бы попытаться передать ссылку на ProductInfoPanel
каждые Product
, чтобы они могли сделать обновить его в их обработчике щелчка.
Есть ли способ достичь того, чего я хочу, и избежать использования состояния, чтобы отслеживать, что было нажато?