react setState 不更新状态

IT技术 javascript reactjs state setstate
2021-01-20 00:14:55

所以我有这个:

let total = newDealersDeckTotal.reduce(function(a, b) {
  return a + b;
},
0);

console.log(total, 'tittal'); //outputs correct total
setTimeout(() => {
  this.setState({ dealersOverallTotal: total });
}, 10);

console.log(this.state.dealersOverallTotal, 'dealersOverallTotal1'); //outputs incorrect total

newDealersDeckTotal只是一个数字数组,[1, 5, 9]例如但是this.state.dealersOverallTotal没有给出正确的总数但是total呢?我什至设置了超时延迟,看看这是否解决了问题。任何明显的还是我应该发布更多代码?

6个回答

setState()通常是异步的,这意味着在您console.log设置状态时,它还没有更新。尝试将日志放入setState()方法的回调中状态改变完成后执行:

this.setState({ dealersOverallTotal: total }, () => {
  console.log(this.state.dealersOverallTotal, 'dealersOverallTotal1');
}); 
我完全忘记了它是异步调用的事实,并且除了这个之外做了所有可能的代码更改,在这里你让我的大脑免于烧坏。谢谢
2021-03-10 00:14:55
这也适用于我,过去我使用过这个:`this.setState({someVar: newValue},function(){ console.log("force update}); '但由于某种原因它并不令人担忧再有,当我按照上面的描述更新代码时,它就可以工作了。知道为什么吗?
2021-03-15 00:14:55
imgur.com/Ku0OjTl请告诉我我该怎么做才能摆脱这个问题。
2021-03-21 00:14:55
除此之外,OP调用setState.
2021-03-29 00:14:55
@Jozcar 应该也可以,语法不正确(缺少括号): this.setState({someVar: newValue},function(){ console.log("force update") });
2021-04-06 00:14:55

setState 是异步的。您可以使用回调方法来获取更新的状态。

changeHandler(event) {
    this.setState({ yourName: event.target.value }, () => 
    console.log(this.state.yourName));
 }

在钩子的情况下,你应该使用useEffect钩子。

const [fruit, setFruit] = useState('');

setFruit('Apple');

useEffect(() => {
  console.log('Fruit', fruit);
}, [fruit])
太好了,它适用于 useEffect。但为什么它需要一个?
2021-03-28 00:14:55
useEffect在每次重新渲染时运行,并且如果传入数组的项目是状态变量 sand 已更改。所以当水果改变并且组件重新渲染时,useEffect 将运行。
2021-04-03 00:14:55
我在 useEffect 之外运行 setFruit 和 console.log Fruit,它没有改变。:/
2021-04-09 00:14:55

使用异步/等待

async changeHandler(event) {
    await this.setState({ yourName: event.target.value });
    console.log(this.state.yourName);
}
setState 不返回Promise,所以我不希望这会起作用。
2021-03-29 00:14:55

setState()操作是异步的,因此您console.log()将在setState()改变值之前执行,因此您看到结果。

要解决它,请在 的回调函数中记录值setState(),例如:

setTimeout(() => {
    this.setState({dealersOverallTotal: total},
    function(){
       console.log(this.state.dealersOverallTotal, 'dealersOverallTotal1');
    });
}, 10)
非常巧妙地使用回调来确保在后续调用之前更新状态!
2021-03-17 00:14:55
JavaScript 总是同步的。
2021-03-19 00:14:55
@santoshsingh。哦,那是我的错误。没有正确地构成句子
2021-03-19 00:14:55
正如你上面提到的 javascript 是异步的——这是不正确的。它主要是同步的,在某些情况下它是异步的。 stackoverflow.com/questions/2035645/...
2021-03-30 00:14:55
@santoshsingh 你有一个误解。API 调用、超时都是异步发生的。
2021-04-06 00:14:55