学习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>
);
}
4条答案
按热度按时间zfciruhq1#
这里的
setItems
不是异步的。这意味着。在下一行你将不会得到更新的值。或者换句话说,它不会等待更新的值,然后转到下一行。所以这里发生的事情是。如果你在
setItems
之后写console.log
,它会给予你旧的状态。把它记录在函数之外的任何地方。通常我把我所有的日志都放在return
语句之前正式文件
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
rt4zxlrg3#
昨天我回答了一个问题,这个问题的性质与你的问题类似。
因此您可以引用:与react useState和useEffect的怪异行为相关
ercv8c1e4#
setItems()是异步的,这意味着在您使用console.log记录状态时,它还没有更新
解决方案1:使用useEffect()挂钩
解决方案2:使用简单变量代替usestate()
要了解有关问题解决方案的更多信息,请转到here