REACT - toggle class onclick

后端 未结 14 1720
长情又很酷
长情又很酷 2020-11-27 11:40

I am trying to figure out how to toggle an active class onClick to change CSS properties.

I have taken many approaches, and read many SO answers. Using

相关标签:
14条回答
  • 2020-11-27 11:52

    Use state. Reacts docs are here.

    class MyComponent extends Component {
        constructor(props) {
            super(props);
            this.addActiveClass= this.addActiveClass.bind(this);
            this.state = {
                active: false,
            };
        }
        toggleClass() {
            const currentState = this.state.active;
            this.setState({ active: !currentState });
        };
    
        render() {
            return (
                <div 
                    className={this.state.active ? 'your_className': null} 
                    onClick={this.toggleClass} 
                >
                    <p>{this.props.text}</p>
                </div>
            )
      }
    }
    
    class Test extends Component {
        render() {
            return (
                <div>
                    <MyComponent text={'1'} />
                    <MyComponent text={'2'} />
                </div>
            );
        }
    }
    
    0 讨论(0)
  • 2020-11-27 12:01

    using React you can add toggle class to any id/element, try

    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>
        )
        }
    ......
    
    0 讨论(0)
  • 2020-11-27 12:01

    Thanks to @cssko for providing the correct answer, but if you tried it yourself you will realise it does not work. A suggestion has been made by @Matei Radu, but was rejected by @cssko, so the code remains unrunnable (it will throw error 'Cannot read property bind of undefined'). Below is the working correct answer:

    class MyComponent extends React.Component {
      constructor(props) {
        super(props);
        this.addActiveClass = this.addActiveClass.bind(this);
        this.state = {
          active: false,
        };
      }
      addActiveClass() {
        const currentState = this.state.active;
        this.setState({
          active: !currentState
        });
      };
    
      render() {
        return ( <
          div className = {
            this.state.active ? 'your_className' : null
          }
          onClick = {
            this.addActiveClass
          } >
          <
          p > {
            this.props.text
          } < /p> < /
          div >
        )
      }
    }
    
    class Test extends React.Component {
      render() {
        return ( <
          div >
          <
          MyComponent text = {
            'Clicking this will toggle the opacity through css class'
          }
          /> < /
          div >
        );
      }
    }
    
    ReactDOM.render( <
      Test / > ,
      document.body
    );
    .your_className {
      opacity: 0.3
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.12.0/umd/react.production.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.12.0/umd/react-dom.production.min.js"></script>

    0 讨论(0)
  • 2020-11-27 12:05

    Well, your addActiveClass needs to know what was clicked. Something like this could work (notice that I've added the information which divs are active as a state array, and that onClick now passes the information what was clicked as a parameter after which the state is accordingly updated - there are certainly smarter ways to do it, but you get the idea).

    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>
        );
      }
    }
    
    0 讨论(0)
  • 2020-11-27 12:05

    You can also do this with hooks.

    function MyComponent (props) {
      const [isActive, setActive] = useState(false);
    
      const toggleClass = () => {
        setActive(!isActive);
      };
    
      return (
        <div 
          className={isActive ? 'your_className': null} 
          onClick={toggleClass} 
        >
          <p>{props.text}</p>
        </div>
       );
    }  
    
    0 讨论(0)
  • 2020-11-27 12:07

    The above answers will work, but just in case you want a different approach, try classname: https://github.com/JedWatson/classnames

    0 讨论(0)
提交回复
热议问题