揭示只是一个组员的成分会比较容易。关闭其余的将会有点棘手。
揭示配料 - 没有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