REACT - 切换类 onclick

IT技术 javascript reactjs
2021-02-05 21:55:23

我想弄清楚如何切换活动类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>
  }

}
6个回答

使用状态。Reacts 文档在这里

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>
        );
    }
}
我已经分解了组件,但这仍然会active在单击时添加到每个元素中。我只想要一个元素有一个活动类
2021-03-17 21:55:23
这不能称为切换的“活动”类,因为其他元素的活动类仍然存在。
2021-03-29 21:55:23
您能否更新答案以使用onClick而不是全部小写,因为您不正确
2021-04-08 21:55:23
有没有办法在不创建额外组件的情况下做到这一点?
2021-04-10 21:55:23
您想将复杂的组件分解成更小的组件,请参阅facebook.github.io/react/docs/...
2021-04-13 21:55:23

你也可以用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>
   );
}  
感谢您加入这个答案。我遇到了两个类和 isActive 的问题?'your_className': null 这有帮助。
2021-03-17 21:55:23

我更喜欢在内联 if 语句中使用 "&&" -operator。在我看来,它以这种方式提供了更清晰的代码库。

通常你可以做这样的事情

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

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

this.state = { active: false }

或者如果你想在 JSX 中注入 css 你可以这样做

<button style={this.state.active && style.button} >button</button>

你可以声明样式json变量

const style = { button: { background:'red' } }

记得在 JSX 样式表上使用驼峰命名法。

好吧,您的 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>
    );
  }
}

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 中使用它时,这会变得更加复杂。只需深入研究react单向数据流和可能帮助您处理它的 redux。

为什么每个项目?它会将类添加到您为其添加条件的项目中。理想情况下,您的项目应该抽象为Item组件。然后您将包含它 3 次,基本上将有 3 个项目,每个项目都有自己的isActive状态。是你的意思吗?
2021-03-14 21:55:23
但这会在单击时将活动类添加到每个项目。我只希望单击该项目以具有active类名
2021-03-24 21:55:23
在你的 jsx 标记中做 - <div className={this.state.isActive ? 'active' : ''}>. 它是关于条件渲染的,但仍然依赖于状态。
2021-03-28 21:55:23
不把它拆分成一个Item组件有没有办法做到这一点?
2021-03-31 21:55:23
我明白,state但这仍然没有真正解释如何在单击元素时更新类名
2021-04-10 21:55:23