反应-切换类onclick

我试图弄清楚如何切换活动类onClick以更改CSS属性。

我采取了许多方法,并阅读了许多SO答案。使用jquery会相对简单,但是,我无法弄清楚使用react来做到这一点。我的代码如下。谁能建议我该怎么做?

如果不为每个项目创建新组件,是否可以这样做?

class Test extends Component(){

    constructor(props) {

    super(props);
    this.addActiveClass= this.addActiveClass.bind(this);

  }

  addActiveClass() {

    //not sure what to do here

  }

    render() {
    <div>
      <div onClick={this.addActiveClass}>
        <p>1</p>
      </div>
      <div onClick={this.addActiveClass}>
        <p>2</p>
      </div>
        <div onClick={this.addActiveClass}>
        <p>3</p>
      </div>
    </div>
  }

}
米亚伽罗L2020/03/16 12:21:53

您可以在点击时添加切换类或切换状态

class Test extends Component(){
  state={
  active:false, 
 }
  toggleClass() {
    console.log(this.state.active)
    this.setState=({
     active:true,
   })
  }

    render() {
    <div>
      <div onClick={this.toggleClass.bind(this)}>
        <p>1</p>
      </div>
    </div>
  }

}
Sam蛋蛋Itachi2020/03/16 12:21:53

上面的答案会起作用,但是如果您需要其他方法,请尝试使用类名:https : //github.com/JedWatson/classnames

GilA2020/03/16 12:21:53

React具有组件状态的概念,因此,如果要切换它,请执行以下操作setState

constructor(props) {
  super(props);

  this.addActiveClass= this.addActiveClass.bind(this);
  this.state = {
    isActive: false
  }
}

addActiveClass() {
  this.setState({
    isActive: true
  })
}

在组件中用于this.state.isActive呈现所需的内容。

当您要在组件1中设置状态并在组件2中使用状态时,这将变得更加复杂。只需深入研究反应单向数据流和可能的redux,即可帮助您进行处理。

米亚伽罗L2020/03/16 12:21:53

使用React您可以将toggle类添加到任何ID /元素,请尝试

style.css

.hide-text{
    display: none !important;
    /* transition: 2s all ease-in 0.9s; */
  }
.left-menu-main-link{
    transition: all ease-in 0.4s;
}
.leftbar-open{
    width: 240px;
    min-width: 240px;
    /* transition: all ease-in 0.4s; */
}
.leftbar-close{
    width: 88px;
    min-width:88px;
    transition: all ease-in 0.4s;
}

fileName.js

......
    ToggleMenu=()=>{
             this.setState({
                isActive: !this.state.isActive
              })
              console.log(this.state.isActive)
        }
        render() {
            return (
                <div className={this.state.isActive===true ? "left-panel leftbar-open" : "left-panel leftbar-close"} id="leftPanel">
                    <div className="top-logo-container"  onClick={this.ToggleMenu}>
                            <span className={this.state.isActive===true ? "left-menu-main-link hide-from-menu" : "hide-text"}>Welcome!</span>
                    </div>

                    <div className="welcome-member">
                        <span className={this.state.isActive===true ? "left-menu-main-link hide-from-menu" : "hide-text"}>Welcome<br/>SDO Rizwan</span>
                    </div>
    )
    }
......
老丝Harry2020/03/16 12:21:53

好吧,您的addActiveClass需要知道单击了什么。这样的事情可能会起作用(请注意,我已经添加了将div作为状态数组激活的信息,并且onClick现在将信息作为参数传递给了单击,然后相应地更新了状态-当然,还有一些更聪明的方法可以做到这一点,但您明白了)。

class Test extends Component(){

  constructor(props) {
    super(props);
    this.state = {activeClasses: [false, false, false]};
    this.addActiveClass= this.addActiveClass.bind(this);
  }

  addActiveClass(index) {
    const activeClasses = [...this.state.activeClasses.slice(0, index), !this.state.activeClasses[index], this.state.activeClasses.slice(index + 1)].flat();
    this.setState({activeClasses});
  }

  render() {
    const activeClasses = this.state.activeClasses.slice();
    return (
      <div>
        <div className={activeClasses[0]? "active" : "inactive"} onClick={() => this.addActiveClass(0)}>
          <p>0</p>
        </div>
        <div className={activeClasses[1]? "active" : "inactive"} onClick={() => this.addActiveClass(1)}>
          <p>1</p>
        </div>
          <div  onClick={() => this.addActiveClass(2)}>
          <p>2</p>
        </div>
      </div>
    );
  }
}