揭示只是一個組員的成分會比較容易。關閉其餘的將會有點棘手。
揭示配料 - 沒有Redux,你可以添加一個國家屬性isOpen
。當你點擊該組件中的一個按鈕時,它應該將狀態屬性isOpen
更改爲true。根據該狀態屬性值隱藏/顯示成分,您可以在標記(如下所示)中使用,或者使用類和CSS規則。
<div key={1}>
showIngredients =() => { this.setState({isOpen: true}) }
<button onClick={this.showIngredients}>Show ingredients</button>
{this.state.isOpen && <div>Ingredients list</div>}
</div>
隱藏其他成分 - 這是有點麻煩,並需要一種不同的解決方案。您需要在父組件中定義一個方法來設置所有子組件的狀態。請注意上述組件中的key
。如果每個孩子都有一個唯一的密鑰,並且父定義selectedKey
一個國家的財產,你可以做這樣的事情:
// parent
revealChild = (key) => {this.setState(selectedKey: key)}
...
<div>
{children.map((child) => {
return <Child onReveal={this.revealChild} key={child.key} isSelected={this.state.selectedKey == child.key}/>
})}
</div>
// child
handleReveal =() => this.props.onReveal(this.props.key)
showIngredientsClass =() => this.props.isSelected ? 'visible' : 'hidden'
showButtonClass =() => this.props.isSelected ? 'hidden' : 'visible'
...
<button onClick={handleReveal} className={this.showButtonClass()}>Show ingredients</button>
<div className={this.showIngredientsClass()}>
My ingredients
</div>
對於第一種解決方案是沒有的狀態,使其適用於每一個對話框,在其中設置它爲真使他們全部開放? – J64
狀態是組件實例的本地狀態。如果你在列表中有3個'ChildItem',則每個''.state''對象都有不同的。因此,在示例一中,打開項目2只會更改項目2的狀態對象。 – dyer
啊,這使得更有意義。我想我只是想弄清楚如何在主應用程序中包含狀態,因爲我認爲我在某處閱讀了多個領域的狀態是不好的練習。我可能誤解了。 – J64