使用 Hooks 在 React 中更新数组

新手上路,请多包涵

我试图弄清楚 React Hook API 的工作原理。我正在尝试向列表中添加一个数字。我评论的代码,即 myArray.push… 似乎没有执行该操作,尽管它下面的代码工作正常。为什么会这样?

 import React, {useState} from 'react'

export default () => {

  const [myArray, setArray] = useState([1,2,3])

  return (
    <div>
      {myArray.map((item=>{

        return <li>{item}</li>

      }))}
      <button onClick = {()=>{

        // myArray.push(myArray[myArray.length-1]+1)
        // setArray(myArray)

        setArray([...myArray, myArray[myArray.length-1]+1])

      }}>Add</button>
    </div>
  )
}

原文由 Jithin Ks 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 531
2 个回答

对于比单个值更复杂的任何事情,我建议使用 useReducer

 function App() {
  const [input, setInput] = useState(0);

  const [myArray, dispatch] = useReducer((myArray, { type, value }) => {
    switch (type) {
      case "add":
        return [...myArray, value];
      case "remove":
        return myArray.filter((_, index) => index !== value);
      default:
        return myArray;
    }
  }, [1, 2, 3]);

  return (
    <div>
      <input value={input} onInput={e => setInput(e.target.value)} />
      <button onClick={() => dispatch({ type: "add", value: input})}>
        Add
      </button>

      {myArray.map((item, index) => (
        <div>
          <h2>
            {item}
            <button onClick={() => dispatch({ type: "remove", value: index })}>
              Remove
            </button>
          </h2>
        </div>
      ))}
    </div>
  );
}

原文由 K.. 发布,翻译遵循 CC BY-SA 4.0 许可协议

您没有在注释代码中改变数组,因此当您尝试 setState 时,挂钩会在内部检查是否由于引用未更新 myArray 而传递相同的状态,因此不会再次触发重新渲染。

但是在工作代码中,您正在创建一个新的数组实例,因此更新工作正常

原文由 Shubham Khatri 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题