所以我有一个对象array.我遍历这个数组,并 for each 对象创建一个按钮.

看起来像这样

myarray.map(item =>
        <Button
          className={item.active? "btn-active" : "btn-disabled"}
          onClick={() => setActive(item);
          }}
        >
          {item.active? "Checking..." : "Start"}
        </Button>
)

我所期望的行为是,当按下一个按钮时,它将变为动作,其余所有按钮保持不活动状态;当按下一个新按钮时,新按钮现在处于活动状态,其余所有按钮都处于禁用状态.一次只能激活一个按钮.

然而,我遇到的问题是,当按下一个新按钮时,它会变为活动按钮,但旧按钮不会更改类,并且即使其"活动"属性设置为false,也会保持活动状态.

你知道我该如何纠正这种行为吗?

推荐答案

如果不全面了解您如何使用state,下面是一个工作示例.我看到的另一个问题是,在映射的jsx元素上缺少一个键.

您可能没有有状态地修改myarray.

import "./styles.css";
import React from "react";

export default function App() {
  const [myarray, setMyarray] = React.useState([
    { id: 1, active: false },
    { id: 2, active: false }
  ]);

  const setActive = (id) => {
    setMyarray((prev) =>
      prev.map((item) => {
        if (item.id === id) {
          return { ...item, active: true };
        }
        return { ...item, active: false };
      })
    );
  };

  return (
    <div className="App">
      {myarray.map((item) => (
        <button
          key={`button-${item.id}`}
          className={item.active ? "btn-active" : "btn-disabled"}
          onClick={() => setActive(item.id)}
        >
          {item.active ? "Checking..." : "Start"}
        </button>
      ))}
    </div>
  );
}

https://codesandbox.io/s/flamboyant-shirley-i24v0z

Javascript相关问答推荐

如何在JavaScript中在文本内容中添加新行

在分区内迭代分区

有什么(最佳)方法可以从模块中获取脚本模块的多姆元素吗?

Google图表时间轴—更改hAxis文本 colored颜色

PrivateRoute不是路由组件错误

如何使覆盖div与可水平滚动的父div相关?

将现场录音发送到后端

Chart.js 4.4.2,当悬停在一个数据点上时,如何在工具提示中拥有多个数据点/标签?

获取Uint8ClampedArray中像素数组的宽度/高度

用JS从平面文件构建树形 struct 的JSON

删除加载页面时不存在的元素(JavaScript)

每次重新呈现时调用useState initialValue函数

在查看网页时,如何使HTML中的按钮工作方式类似于鼠标上的滚轮或箭头键?

JavaScript&;Reaction-如何避免在不使用字典/对象的情况下出现地狱?

如何在Highlihte.js代码区旁边添加行号?

将延迟加载的模块转换为Eager 加载的模块

为什么这个最小Angular 的Licial.dev设置不起作用?

Firebase函数中的FireStore WHERE子句无法执行

在此div中添加一个类,并在一段时间后在Java脚本中将其删除

如何在不将整个文件加载到内存的情况下,在Node.js中实现Unix粘贴命令?