使用Hooks在React中更新数组

时间:2019-02-19 15:53:32

标签: 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>
  )
}

3 个答案:

答案 0 :(得分:3)

对于任何比单个值复杂的事情,我建议使用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>
  );
}

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

您可以使用way to deep clone an object并将其用作更改数组值的临时变量。

下面是您的代码示例:

import React, { useState } from 'react'

export default () => {
  const [myArray, setArray] = useState([1, 2, 3])
  var tmpArray = JSON.parse(JSON.stringify(myArray))

  return (
    <div>
      {myArray.map((item) => {
        return <li>{item}</li>
      })}
      <button
        onClick={() => {
          tmpArray.push(tmpArray[tmpArray.length - 1] + 1)
          setArray(tmpArray)
        }}
      >
        Add
      </button>
    </div>
  )
}