【发布时间】:2022-01-06 17:33:44
【问题描述】:
当我尝试使用之前的状态更新数组时,设置状态会被执行两次。
const [countries,setCountries] = useState(["usa","china","russia"])
const [updated, setUpdated] = useState(0)
const updateCountries = () => {
console.log("I should be printed once and being printed ONCE")
setCountries(previous => {
console.log("I should be printed once but being printed TWICE")
return previous.map(country => {
setUpdated(prev => prev+1)
return country
});
})
console.log(updated)
// 6
}
虽然使用当前状态解决了这个问题:
const updateCountries = () => {
console.log("I should be printed once and being printed ONCE")
setCountries(countries.map(country => {
setUpdated(prev => prev+1)
return country
}))
console.log(updated)
// 3
}
我在使用之前的状态时是否遗漏了一些反应规则?
更新:我无法在其他反应组件中重现此行为。因此,可能是其他组件代码触发了这种意外行为。
【问题讨论】:
-
countries不是最初是一个数组,您调用useState时带有三个单独的参数(其中两个被忽略)。 -
请提供一个minimal reproducible example,人们实际上可以运行,至少是我们可以放入基本CRA 框架或其他东西的组件。并仔细检查
StrictMode。 -
console.log("我应该打印一次,但会打印两次") 将只打印一次。 codesandbox.io/s/upbeat-shockley-gl26t?file=/src/App.js
-
meta.stackoverflow.com/q/338537/3001761。或者只是可以复制粘贴的整个组件,而不是随机的 sn-ps(根据您在下面的评论,它不包含实际导致此问题的任何内容)。
-
这就是为什么我们要求从 MRE 开始 - 这是基本的调试,如果你这样做了,那么在发布之前你就会知道问题出在哪里问题。
标签: reactjs react-native