首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么setState在reactjs中是异步的,而不是同步的?

为什么setState在reactjs中是异步的,而不是同步的?
EN

Stack Overflow用户
提问于 2016-03-18 21:30:44
回答 8查看 134.2K关注 0票数 161

我刚刚发现,在react中,任何组件中的this.setState()函数都是异步的,或者是在调用它的函数完成后调用的。

现在我搜索并找到了这个博客(setState() State Mutation Operation May Be Synchronous In ReactJS)

在这里,他发现setState是异步的(当堆栈为空时调用)还是同步的(调用时立即调用),这取决于状态更改是如何触发的。

现在这两件事很难消化了。

  1. 在博客中setState函数在function updateState中被调用,但是被调用的函数不知道是什么触发了updateState函数。
  2. 为什么他们要让setState异步,因为JS是单线程语言,而这个setState不是WebAPI或服务器调用,所以只能在JS的线程上完成。他们这样做是不是为了让重新渲染不会停止所有的事件侦听器和其他东西,或者有其他一些设计问题。
EN

回答 8

Stack Overflow用户

发布于 2016-11-04 02:39:02

您可以在状态值更新后调用函数:

this.setState({foo: 'bar'}, () => { 
    // Do something here. 
});

此外,如果您有许多状态需要一次更新,请将它们都分组到同一个setState

而不是:

this.setState({foo: "one"}, () => {
    this.setState({bar: "two"});
});

只需执行以下操作:

this.setState({
    foo: "one",
    bar: "two"
});
票数 178
EN

Stack Overflow用户

发布于 2016-03-18 22:38:00

1) setState操作是异步的,并且是批处理的,以提高性能。这在setState的文档中有解释。

setState()不会立即改变this.state,但会创建一个挂起的状态转换。在调用此方法后访问this.state可能会返回现有值。不能保证对setState的调用的同步操作,可能会对调用进行批处理以提高性能。

2)为什么他们要使setState异步,因为JS是单线程语言,而此setState不是WebAPI或服务器调用?

这是因为setState改变了状态并导致重新呈现。这可能是一个昂贵的操作,使其同步可能会使浏览器无响应。

因此,setState调用是异步的,并且是批处理的,以获得更好的UI体验和性能。

票数 121
EN

Stack Overflow用户

发布于 2018-01-25 16:00:51

我知道这个问题很老了,但是很长一段时间以来,它一直给包括我在内的许多reactjs用户带来了很多困惑。最近,丹·阿布拉莫夫(来自react团队)写了一个很好的解释,解释了为什么setState的本质是异步的:

https://github.com/facebook/react/issues/11527#issuecomment-360199710

在更改状态的场景中,ReactJS会考虑许多变量,以决定何时应该实际更新state并重新呈现组件。

演示这一点的一个简单示例是,如果您调用setState作为对用户操作的响应,那么state可能会立即更新(尽管,同样,您不能指望它),因此用户不会感觉到任何延迟,但是如果您调用setState来响应ajax调用响应或其他不是由用户触发的事件,那么状态更新可能会有轻微的延迟,因为用户不会真正感受到这种延迟,并且它将通过等待将多个状态更新批处理在一起并较少地重新呈现DOM来提高性能。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36085726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档