我正在显示不同的汽车和一个按钮,用于添加或删除用户所做的 Select .如何让按钮单独更改状态?到目前为止,它将所有按钮的状态更改为一个值.

const cars = [
  { name: "Benz", selected: false },
  { name: "Jeep", selected: false },
  { name: "BMW", selected: false }
];

export default function App() {
  const isJeepSelected = true;
  const isBenzSelected = true;

  return (
    <div className="App">
      {cars.map((values, index) => (
        <div key={index}>
          <Item
            isBenzSelected={isBenzSelected}
            isJeepSelected={isJeepSelected}
            {...values}
          />
        </div>
      ))}
    </div>
  );
}

const Item = ({ name, isBenzSelected, isJeepSelected }) => {
  const [toggle, setToggle] = useState(false);
  const handleChange = () => {
    setToggle(!toggle);
  };

  if (isBenzSelected) {
    cars.find((val) => val.name === "Benz").selected = true;
  }

  console.log("cars --> ", cars);
  console.log("isBenzSelected ", isBenzSelected);
  console.log("isJeepSelected ", isJeepSelected);

  return (
    <>
      <span>{name}</span>
      <span>
        <button onClick={handleChange}>
          {!toggle && !isBenzSelected ? "Add" : "Remove"}
        </button>
      </span>
    </>
  );
};

我创建了一个使用Code Sandbox的工作示例.有人能帮帮忙吗?

推荐答案

这里有太多的硬编码.如果你有300辆车呢?您必须编写300个Boolean useState钩子调用,如果您有一个任意的API有效负载(通常情况下),它仍然不是动态的.

试着考虑如何概括您的逻辑,而不是像"Benz"Jeep那样硬编码数值.这些概念与任意的数据内容联系得太紧密了.

cars看起来应该是状态,因为你从react 中变异了它.

以下是另一种方法:

const App = () => {
  const [cars, setCars] = React.useState([
    {name: "Benz", selected: false},
    {name: "Jeep", selected: false},
    {name: "BMW", selected: false},
  ]);
  
  const handleSelect = i => {
    setCars(prevCars => prevCars.map((e, j) =>
      ({...e, selected: i === j ? !e.selected : e.selected})
    ));
  };

  return (
    <div className="App">
      {cars.map((e, i) => (
        <div key={e.name}>
          <Item {...e} handleSelect={() => handleSelect(i)} />
        </div>
      ))}
    </div>
  );
};

const Item = ({name, selected, handleSelect}) => (
  <React.Fragment>
    <span>{name}</span>
    <span>
      <button onClick={handleSelect}>
        {selected ? "Remove" : "Add"}
      </button>
    </span>
  </React.Fragment>
);

ReactDOM.render(<App />, document.querySelector("#root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.26.0/babel.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.production.min.js"></script>
<div id="root"></div>

考虑为元素生成唯一ID,而不是使用索引或假定名称是唯一的.要做到这一点,crypto.randomUUID()是一种便捷的方式.

Javascript相关问答推荐

React:如何将表格收件箱正确渲染为表格主体内的组件?

使用NgDeliverentOutlet和动态内容投影的Angular 渲染组件

如何在alpinejs中显示dev中x-for的元素

Vega中的模运算符

fs. writeFile()vs fs.writeFile()vs fs.appendFile()

我可以使用CSS有效地实现最大宽度=100%和最大高度=100%,而无需父母有明确的/固定的宽度和高度,替代方法吗?

docx.js:如何在客户端使用文档修补程序

在观察框架中搜索CSV数据

当作为表达式调用时,如何解析方法decorator 的签名?

在带有背景图像和圆形的div中添加长方体阴影时的重影线

我在Django中的视图中遇到多值键错误

查询参数未在我的Next.js应用路由接口中定义

钛中的onClick事件需要在两次点击之间等待几秒钟

Next.js中的服务器端组件列表筛选

是否可以将Select()和Sample()与Mongoose结合使用?

P5.js中矩形内的圆弧

表单数据中未定义的数组键

连续添加promise 时,如何在所有promise 都已结算时解除加载覆盖

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

在对象的嵌套数组中添加两个属性