【问题标题】:How to push an object in an array, using react hooks and typscript?如何使用反应钩子和打字稿将对象推送到数组中?
【发布时间】:2021-05-28 18:47:45
【问题描述】:

我知道这完全是一个菜鸟问题,很抱歉,但我试图弄清楚在提交表单时我应该如何设法将对象放入状态数组中。谢谢

interface newList {
  name: string;
}

const ListAdder = () => {
  const [listName, setListName] = useState("");
  const [listArray, setListArray] = useState<any>([]);

  const submitHandler = (e: FormEvent<HTMLFormElement>) => {
    e.preventDefault();

    const myNewList: newList = {
      name: listName,
    };

    setListArray([...listArray].push(myNewList));
    setListName("");
    console.log(listArray);
  };

  const listNameHandler = (e: FormEvent<HTMLInputElement>) => {
    setListName(e.currentTarget.value);
  };

  return (
    <>
      <form onSubmit={submitHandler}>
        <label>Create your List</label>
        <br />
        <input
          type="text"
          placeholder="List name is..."
          value={listName}
          onChange={listNameHandler}
        />
        <button type="submit">Add the List</button>
      </form>
    </>
  );
};

【问题讨论】:

  • 把这个setListArray([...listArray].push(myNewList));改成setListArray([...listArray, myNewList]);

标签: reactjs typescript react-hooks


【解决方案1】:

问题是您保存的是推送的结果,即新长度,而不是更新后的数组。

setListArray([...listArray].push(myNewList)); // <-- saves result of push, [].length

你可以concat新元素:

setListArray([...listArray].concat(myNewList));

或者只是附加它

setListArray([...listArray, myNewList]);

其他半相关问题,您无法通过控制台记录状态并期望看到它立即更新。

setListArray([...listArray, myNewList]);
console.log(listArray); // <-- still current state

React 状态更新是异步的,因此像这样记录状态只会记录当前渲染周期中的状态而不是 下一个渲染周期的排队状态。如果您想在更新后记录状态,请使用带有依赖关系的 useEffect 挂钩。

useEffect(() => {
  console.log(listArray);
}, [listArray]);

【讨论】:

  • 感谢您提供的详细信息和作品。只有一件事,我应该在状态声明中使用哪种类型来代替
  • @Mugi 我对 Typescript 不是很熟悉,但据我所知,如果我没有搞砸语法,可能是 useState&lt;newList []&gt;([]);,换句话说,它是 @987654330 的数组@ 类型,即newList[]。看起来useState&lt;Array&lt;newList&gt;&gt;([]); 也可以工作。 typescriptlang.org/docs/handbook/2/everyday-types.html#arrays
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 2020-08-09
  • 2020-12-30
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多