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

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

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

  1. class App extends Component {
  2. constructor(){
  3. super();
  4. this.state = {
  5. active: false
  6. }
  7. }
  8. handleClick(){
  9. this.setState({active: !this.state.active})
  10. }
  11. renderButtons(i, f){
  12. return <Button value={i} className="button" id={f} active= {this.state.active} onClick={() => this.handleClick()}/>
  13. }
  14. render() {
  15. return (
  16. <div className="App">
  17. {this.renderButtons("red", "buttonRed")}
  18. {this.renderButtons("blue", "buttonBlue")}
  19. {this.renderButtons("green", "buttonGreen")}
  20. {this.renderButtons("yellow", "buttonYellow")}
  21. </div>
  22. );
  23. }
  24. }

我的CSS:

  1. .button{
  2. width: 100px;
  3. height: 45px;
  4. opacity: .3;
  5. margin: 0 auto;
  6. margin-bottom: 30px;
  7. }
  8. #buttonRed{
  9. background: red;
  10. }
  11. #buttonBlue{
  12. background: blue;
  13. }
  14. #buttonGreen{
  15. background: green;
  16. }
  17. #buttonYellow{
  18. background: yellow;
  19. }

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

jjjwad0x

jjjwad0x1#

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

  1. import classNames from 'classnames';

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

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

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

  1. render(){
  2. const classes = classNames({
  3. button: true, // we always want this class
  4. active: this.state.active, // only add this class if the state says so
  5. });
  6. return (
  7. <button className={classes} />
  8. );
  9. }
展开查看全部
cyej8jka

cyej8jka2#

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

  1. import React, { useState } from "react";import "./styles.css";
  2. export default function App() {
  3. const [isActive, setActive] = useState("false");
  4. const handleToggle = () => {
  5. setActive(!isActive); };
  6. return (
  7. <div className={isActive ? "app" : null}>
  8. <h1>Hello react</h1>
  9. <button onClick={handleToggle}>Toggle class</button>
  10. </div>
  11. );
  12. }
pieyvz9o

pieyvz9o3#

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

cedebl8k

cedebl8k4#

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

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

hzbexzde5#

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

  1. import { useState } from "react";
  2. function FakeComponent() {
  3. const [changingClass, setChangingClass] = useState("");
  4. function handleToggle() {
  5. if (changingClass === "") {
  6. setChangingClass("additionalClasses");
  7. } else {
  8. setChangingClass("");
  9. }
  10. }
  11. return (
  12. <div className={`class anotherClass thirdClass ${changingClass}`}>
  13. <button onClick={handleToggle}></button>
  14. </div>
  15. );
  16. }
  17. export default FakeComponent;
展开查看全部

相关问题