【问题标题】:Add class when button clicked in react.js在 react.js 中单击按钮时添加类
【发布时间】:2017-07-20 06:22:18
【问题描述】:

我已经在 React 上工作了几个星期了,虽然我已经掌握了大部分基本语法(props、states),但我仍在努力与一些概念建立联系,尤其是添加类当状态发生变化时。我正在尝试构建一个 simon say 游戏,其中包含四个按钮,全部使用 Button 组件构建。这些最初设置为具有 0.3 的不透明度和 false 的活动状态。单击时,“活动”状态变为真,但我一生无法弄清楚如何添加一个可以使按钮完全不透明的 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;
}

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

【问题讨论】:

    标签: javascript css reactjs


    【解决方案1】:

    React 有几种方法可以做到这一点。第一个是 Tudor Ilisoi 所建议的,它只是连接字符串。 第二种方法是给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() 函数包装。 如果我们早点声明它,我们可以很容易地这样做:

    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} />
         );
    }
    

    【讨论】:

    • 谢谢,这个解释很透彻!我假设您可以根据需要将任意数量的键/值对传递给 className 对象?就这样我理解正确,当 this.state.active 为假时,Button 将有一类“按钮”,但当 this.state.active 为真时,会有两类“按钮”和“活动”?
    • 如果类有连字符怎么办?我不允许这样做{red-button: true}
    • 事实上,我很难让它与任何类名一起工作:const valueSpan = &lt;span className={{small: true}}&gt;label&lt;/span&gt;; 呈现为&lt;span class="[object Object]"&gt;label&lt;/span&gt;
    • @steve,我已经编辑了答案。在同行评审之后,您应该可以在一段时间内在线看到它。希望对你有帮助,干杯!
    • @steve 它在线
    【解决方案2】:

    className="button" 更改为className={'button ' + f}

    用大括号括起来的表达式被评估为 javascript 并生成一个字符串

    另请注意,使用花括号语法时,您不必在属性值周围添加双引号 ""

    当你的 JSX 被解析时,React 会生成正确的 HTML 属性,例如class="button red"

    【讨论】:

      【解决方案3】:

      你有没有试过,给renderButtons传递一个可选参数,检查它并添加到类中:

      ...
       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()}/>
        }
      ...
      

      【讨论】:

        【解决方案4】:

        如果您正在寻找 2021/2022 年的答案: 这是一个使用 react 钩子的示例,当我们单击 Toggle 类按钮时,它将类名 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>
          );
        }
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-12
        • 2019-01-29
        • 2019-07-06
        • 1970-01-01
        • 1970-01-01
        • 2015-05-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多