使用Hooks在React中更新数组

Jit*_* Ks 9 javascript reactjs react-hooks

我试图弄清楚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>
  )
}
Run Code Online (Sandbox Code Playgroud)

K..*_*K.. 9

我建议将其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>
  );
}
Run Code Online (Sandbox Code Playgroud)


Shu*_*tri 6

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

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