javascript 在React中,为什么console.log中缺少最后一个数组项?

eoxn13cs  于 2022-10-30  发布在  Java
关注(0)|答案(4)|浏览(137)

学习React,制作一个非常简单的待办事项列表。我能够按预期添加项目。当我输入一些东西并点击“添加”,项目就会显示在页面上。但我注意到,如果我尝试console.log结果,得到安慰的数组总是缺少最后一个项目。例如,如果我输入“面包”并点击“添加”,它会显示在页面上,但在控制台中,我只得到了一个空数组。如果我输入“milk”并单击“add”,在页面上会同时显示bread和milk,但在控制台中,我只看到[“bread”]作为数组。为什么会发生这种情况?

import { useRef, useState } from "react";

export default function App() {
  const [items, setItems] = useState([]);
  const inputRef = useRef();

  function onSubmit(e) {
    e.preventDefault();
    const value = inputRef.current.value;
    setItems(prev => [...prev, value]);
    console.log(items);
    inputRef.current.value = "";
  }

  return (
    <main>
      <form onSubmit={onSubmit}>
        <input type="text" ref={inputRef} />
        <button type="submit">Add</button>
      </form>
      <h3>My List:</h3>
      <ul>
        {items.map(item => (
          <li>{item}</li>
        ))}
      </ul>
    </main>
  );
}
zfciruhq

zfciruhq1#

这里的setItems不是异步的。这意味着。在下一行你将不会得到更新的值。或者换句话说,它不会等待更新的值,然后转到下一行。
所以这里发生的事情是。如果你在setItems之后写console.log,它会给予你旧的状态。把它记录在函数之外的任何地方。通常我把我所有的日志都放在return语句之前

console.log(items)
return (
.........
)

正式文件

uqcuzwp8

uqcuzwp82#

基本上就是https://reactjs.org/docs/react-component.html#setstate
我认为这个主题是
Why does calling react setState method not mutate the state immediately?
React setState not updating state

rt4zxlrg

rt4zxlrg3#

昨天我回答了一个问题,这个问题的性质与你的问题类似。
因此您可以引用:与react useState和useEffect的怪异行为相关

ercv8c1e

ercv8c1e4#

setItems()是异步的,这意味着在您使用console.log记录状态时,它还没有更新

解决方案1:使用useEffect()挂钩

useEffect(() => {
    // action on update of items
}, [items]);

解决方案2:使用简单变量代替usestate()

const items = [];

要了解有关问题解决方案的更多信息,请转到here

相关问题