這是我想要實現的。我有兩個React組件Product
和ProductInfoPanel
,顯示在ProductList
組件內。 Product
顯示有關產品的選定信息,例如產品名稱和價格。單擊產品時,更多詳細信息將顯示在ProductInfoPanel
中。所以我需要通過wah twas點擊到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
的引用,所以他們可以做他們的單擊處理程序更新。
有沒有辦法實現我想要的,並避免使用狀態來跟蹤點擊的內容?