css 在react.js中单击按钮时添加类

lsmepo6l  于 2023-10-21  发布在  React
关注(0)|答案(5)|浏览(138)

我已经在React上工作了几个星期,虽然我已经掌握了大部分基本语法(props,states),但我仍然在努力与一些概念建立联系,最明显的是当状态发生变化时添加类。我试图建立一个西蒙说游戏,其中包含四个按钮,所有使用按钮组件构建。它们最初设置为不透明度为0.3,活动状态为false。当点击时,状态“active”变为true,但是我无法为我的生活弄清楚如何添加一个css类,可以给予按钮完全不透明。下面是我的代码:

class App extends Component {
  constructor(){
    super();
    this.state = {
      active: false
    }
  }
  handleClick(){
    this.setState({active: !this.state.active})
  }
  renderButtons(i, f){
    return <Button value={i} className="button" id={f} active= {this.state.active} onClick={() => this.handleClick()}/>
  }
  render() {
    return (
      <div className="App">
        {this.renderButtons("red", "buttonRed")}
        {this.renderButtons("blue", "buttonBlue")}
        {this.renderButtons("green", "buttonGreen")}
        {this.renderButtons("yellow", "buttonYellow")}
      </div>
    );
  }
}

我的CSS:

.button{
  width: 100px;
  height: 45px;
  opacity: .3;
  margin: 0 auto;
  margin-bottom: 30px;
}
#buttonRed{
  background: red;
}
#buttonBlue{
  background: blue;
}
#buttonGreen{
  background: green;
}
#buttonYellow{
  background: yellow;
}

所以,现在,我只想在单击按钮时添加一个类,同时仍然将“button”类保留到组件中。有人能帮忙吗?

jjjwad0x

jjjwad0x1#

React有几种方法可以做到这一点。第一种是由Tudor Iliquor提出的,它只是连接字符串。第二种方法是给予className一个Object而不是一个string。这种方式可以说是更简单,但需要您添加classnames模块。您可以使用npm install --save classnamesyarn add classnames安装它。您可以使用以下命令导入:

import classNames from 'classnames';

然后你可以按以下方式使用它:

<button className={classNames({button: true, active: this.state.active})} />

第一对花括号只是告诉react我们正在传递一个动态属性,第二对花括号只是对象的普通JavaScript语法。请注意,该对象由classNames()函数 Package 。如果我们早一点声明它,我们可以很容易地做到:

render(){
    const classes = classNames({
        button: true, // we always want this class
        active: this.state.active, // only add this class if the state says so
     });

     return (
          <button className={classes} />
     );
}
cyej8jka

cyej8jka2#

如果你正在寻找2021/2022的答案:下面是一个使用react钩子的例子,当我们点击Toggle class按钮时,它会将类名app添加到div元素中。

import React, { useState } from "react";import "./styles.css";

export default function App() {
  const [isActive, setActive] = useState("false");
  const handleToggle = () => {
    setActive(!isActive);  };
  return (
    <div className={isActive ? "app" : null}>
       <h1>Hello react</h1>
       <button onClick={handleToggle}>Toggle class</button>
    </div>
  );
}
pieyvz9o

pieyvz9o3#

className="button"更改为className={'button ' + f}
用花括号括起来的表达式作为JavaScript计算,并生成一个字符串
另外请注意,当使用花括号语法时,您不必在属性值周围添加双引号""
当你的JSX被解析时,React将生成正确的HTML属性,例如class="button red"

cedebl8k

cedebl8k4#

你有没有尝试过,传递一个可选参数给renderManager,检查它并添加到class:

...
 renderButtons(i, f, c){
    var cssClass =  c&&c!=""? "button " + c : "button";   
    return <Button value={i} className={cssClass}  id={f} active= {this.state.active} onClick={() => this.handleClick()}/>
  }
...
hzbexzde

hzbexzde5#

类似于Davids的答案,但你也可以使用模板文字。

import { useState } from "react";

function FakeComponent() {
  const [changingClass, setChangingClass] = useState("");

  function handleToggle() {
    if (changingClass === "") {
      setChangingClass("additionalClasses");
    } else {
      setChangingClass("");
    }
  }

  return (
    <div className={`class anotherClass thirdClass ${changingClass}`}>
      <button onClick={handleToggle}></button>
    </div>
  );
}

export default FakeComponent;

相关问题