REACT - 切换课程onclick

pet*_*gan 64 javascript reactjs

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

我采取了很多方法,并阅读了许多SO答案.使用jquery它会相对简单,但是,我无法通过反应来解决这个问题.我的代码如下.任何人都可以建议我该怎么做?

如果不为每个项目创建新组件,是否可以执行此操作?

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>
  }

}
Run Code Online (Sandbox Code Playgroud)

css*_*sko 65

使用状态.Reacts docs就在这里.

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>
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你可以更新答案使用`onClick`而不是全部小写,因为你不正确 (5认同)
  • 有没有一种方法,而无需创建额外的组件? (3认同)
  • 您希望将复杂组件分解为更小的组件,请参阅https://facebook.github.io/react/docs/components-and-props.html#extracting-components (2认同)
  • 我已经分解了组件,但这仍然在单击时向每个元素添加了“active”。我只希望一个元素有一个活动类 (2认同)

小智 38

你也可以用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>
   );
}  
Run Code Online (Sandbox Code Playgroud)


Jim*_*ala 10

我宁愿在内联if语句上使用“ &&” -operator。在我看来,它以这种方式提供了更简洁的代码库。

通常你可能会做这样的事情

render(){
return(
  <div>
    <button className={this.state.active && 'active'}
      onClick={ () => this.setState({active: !this.state.active}) }>Click me</button>
  </div>
)
}
Run Code Online (Sandbox Code Playgroud)

请记住,箭头功能是ES6的功能,请记住在类构造函数()中设置“ this.state.active”值{}

this.state = { active: false }
Run Code Online (Sandbox Code Playgroud)

或者,如果您想在JSX中注入CSS,则可以通过这种方式进行

<button style={this.state.active && style.button} >button</button>
Run Code Online (Sandbox Code Playgroud)

你可以声明样式json变量

const style = { button: { background:'red' } }
Run Code Online (Sandbox Code Playgroud)

记得在JSX样式表上使用camelCase。


Ban*_*nić 7

好吧,你的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)];
    this.setState({activeClasses});
  }

  render() {
    const activeClasses = this.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>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)


Asi*_*sim 7

您可以简单地使用 event.target 访问接收单击事件的元素 classList,然后使用 classList 对象上的切换方法来添加或删除预期的类

<div onClick={({target}) => target.classList.toggle('active')}>
  ....
  ....
  ....
</div>
Run Code Online (Sandbox Code Playgroud)

等价物

<div onClick={e=> e.target.classList.toggle('active')}>
  ....
  ....
  ....
</div>
Run Code Online (Sandbox Code Playgroud)

或者通过声明一个处理点击并执行额外工作的函数

function handleClick(el){
    .... Do more stuff
    el.classList.toggle('active');

}
<div onClick={({target})=> handleClick(target)}>
  ....
  ....
  ....
</div>
Run Code Online (Sandbox Code Playgroud)


dho*_*lik 6

React 有组件状态的概念,所以如果你想切换它,请执行以下操作setState

constructor(props) {
  super(props);

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

addActiveClass() {
  this.setState({
    isActive: true
  })
}
Run Code Online (Sandbox Code Playgroud)

在您的组件中使用this.state.isActive来渲染您需要的内容。

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

  • 为什么每个项目?它将将该类添加到您添加条件的项目中。理想情况下,您的项目应该抽象为“Item”组件。然后,您将包含它 3 次,基本上会有 3 个项目,每个项目都有自己的“isActive”状态。是你的意思吗? (2认同)

Riz*_*izo 5

使用 React 你可以将切换类添加到任何 id/元素,尝试

样式.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;
}
Run Code Online (Sandbox Code Playgroud)

文件名.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>
    )
    }
......
Run Code Online (Sandbox Code Playgroud)