Нужно ли мне для каждого элемента списка логическое значение в государственном объекте?
Да, вы должны поддерживать boolean
для каждого элемента списка в state
переменной, и на основе этого state
значения, оказывают содержание list
пунктов, Попробуйте это:
this.state = {showItems: []}
onClick(index){
console.log(index);
let showItems = this.state.showItems.slice();
showItems[index] = !showItems[index];
this.setState({showItems});
}
<ul>
<li onClick={this.onClick.bind(this,0)}> item {this.state.showItems[0] ? <div> some extra text ... </div> : null} </li>
<li onClick={this.onClick.bind(this,1)}> item {this.state.showItems[1] ? <div> some extra text ... </div> : null}</li>
<li onClick={this.onClick.bind(this,2)}> item{this.state.showItems[2] ? <div> some extra text ... </div> : null} </li>
<li onClick={this.onClick.bind(this,3)}> item {this.state.showItems[3] ? <div> some extra text ... </div> : null}</li>
</ul>
Проверьте это рабочий Отрывок:
class App extends React.Component {
constructor(){
super();
this.state = {showItems:[]}
}
onClick(index){
let showItems = this.state.showItems.slice(0);
showItems[index] = !showItems[index];
this.setState({showItems});
}
render() {
return (
<div className="App">
<ul>
<li onClick={this.onClick.bind(this,0)}> item {this.state.showItems[0] ? <div> some extra text ... </div> : null} </li>
<li onClick={this.onClick.bind(this,1)}> item {this.state.showItems[1] ? <div> some extra text ... </div> : null}</li>
<li onClick={this.onClick.bind(this,2)}> item{this.state.showItems[2] ? <div> some extra text ... </div> : null} </li>
<li onClick={this.onClick.bind(this,3)}> item {this.state.showItems[3] ? <div> some extra text ... </div> : null}</li>
</ul>
<div style={{marginTop: 100}}>*click on item to open submenu</div>
</div>
);
}
}
ReactDOM.render(<App />, document.getElementById('container'));
li{
cursor: pointer;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id='container'/>
Проверить fiddle
для рабочего примера: https://jsfiddle.net/mayankshukla5031/18hheyx1/