React Hooks 数组中元素的 setState

Ibr*_*med 4 javascript arrays state typeerror reactjs

如何更新状态数组中的单个元素?这是我目前使用的代码:

const Cars = props => {
  const [cars, setCars] = React.useState(["Honda","Toyota","Dodge"])

  const handleClick1 = () => { setCars[0]("Jeep") }
  const handleClick2 = () => { setCars[1]("Jeep") }
  const handleClick3 = () => { setCars[2]("Jeep") }

  return (
    <div>
      <button onClick={handleClick1}>{cars[0]}</button>
      <button onClick={handleClick2}>{cars[1]}</button>
      <button onClick={handleClick3}>{cars[2]}</button>
    </div>
  )
};
Run Code Online (Sandbox Code Playgroud)

当我单击呈现的按钮之一时,我得到Uncaught TypeError: setCars[0] is not a function at handleClick1.

我知道如何在 React 类中执行此操作,但是如何使用 React Hooks 执行此操作?

Mat*_*ich 11

我建议你通过你的地图cars来渲染它们 - 这总体上简单一百万倍。从那里您可以将onClick处理程序应用于每个按钮..

此外,你不应该像你一样改变状态——总是先复制状态,更新副本,然后用更新的副本设置新状态。

编辑:之前让我想到的一件事keymap在对数组执行 ping 操作时为每个项目添加一个。这应该是标准做法。

const { useState } = React;
const { render } = ReactDOM;

const Cars = props => {
  const [cars, setCars] = useState(["Honda", "Toyota", "Dodge"]);

  const updateCars = (value, index) => () => {
    let carsCopy = [...cars];
    carsCopy[index] = value;
    setCars(carsCopy);
  };

  return (
    <div>
      {cars && cars.map((c, i) => 
        <button key={`${i}_${c}`} onClick={updateCars("Jeep", i)}>{c}</button>
      )}
      <pre>{cars && JSON.stringify(cars, null, 2)}</pre>
    </div>
  );
};

render(<Cars />, document.body);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.12.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.11.0/umd/react-dom.production.min.js"></script>
Run Code Online (Sandbox Code Playgroud)