【问题标题】:ReactJS How to add active class and set state to true or false on toggle list itemsReactJS如何在切换列表项上添加活动类并将状态设置为true或false
【发布时间】:2018-01-17 09:30:51
【问题描述】:

我用react 创建了一个切换列表,当用户单击列表项时,它会折叠并显示一些内容。到目前为止,上帝,但现在它只会在用户点击另一个列表项时再次隐藏,这没问题,但我想实现我可以切换一个项目,我的意思是,当我点击同一个项目时显示和隐藏 - > 例如,我想在单击时将项目的状态设置为真/假,但我不知道该怎么做。现在我只是添加一个活动类,但是如何一次触发两个事件,即设置一个活动类并同时更改状态?

这是我目前得到的:

export default class ToggleList extends React.Component{
constructor(props){
    super()

    this.state = {
        activeItem: null
        activeState: false // maybe something like this?
    };
}

onItemActive(item) {
    this.setState({activeItem: item})
    this.setState({activeState: !this.state.activeState}) // SOMETHING LIKE THIS?
}    

render() {

    let itemsArray = [
        "Lorem ipsum dolor?", 
        "consectetur adipiscing elit?", 
        "commodo consequat?",
        "Excepteur sint occaecat?"
    ]

    let items = itemsArray.map( (item, index) => {
        return (
          <ToggleListItem key={index} item={item} onItemActive={this.onItemActive.bind(this)} 
          active={item === this.state.activeItem} />
        );
    });        
    return(
        <div className="flex-grid">
            <div className="flex-grid-1">
                <div className="flex-grid-header">
                    <h3>{this.props.title}</h3>
                </div>
            </div>
            <div className="flex-grid-2 faq-list">
                <div className="toggleList">
                    <ul>
                        {items}
                    </ul>
                </div>                    
            </div>
        </div>            

    )
}

}

class ToggleListItem extends React.Component {
constructor(props){
    super()
}
setActive() {
    this.props.onItemActive(this.props.item);
}    
render() {
    let item = this.props.item;
    return (
      <li className={this.props.active ? 'active' : ''} onClick={this.setActive.bind(this)} data-selected={this.props.selected}>
            <div className="item-title">
                <p>{item}</p>
            </div>
            <div className="toggle-icon-wrapper">
                <div className="toggle-icon"></div>
            </div>
            <div className="toggleList-content">
                <p>
                    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
                    Ut enim ad minim veniam
                </p>
            </div>
      </li>
    );
  }
}

【问题讨论】:

  • active={item === this.state.activeItem} 检查这个比较,如果是对的,那么 activeitem 是一个数字还是一个对象。如果它是一个对象,可能会比较对象总是返回 false
  • @stack26 啊,是的,当然 :-) 愚蠢的我,我可能再也看不到森林了 :-) 非常感谢!

标签: javascript reactjs


【解决方案1】:

在有用的提示后想通了 :-)

this.state = {
    activeItem: null,
    activeState: false
}

onItemActive(item) {
    this.setState({activeItem: item, activeState: !this.state.activeState})
}

active={item === this.state.activeItem ? this.state.activeState : ''}

解决了!

【讨论】:

    猜你喜欢
    • 2017-05-01
    • 2019-11-16
    • 2020-06-30
    • 1970-01-01
    • 2023-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多