Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么setState在reactjs中是异步的,而不是同步的?

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

Stack Overflow用户
提问于 2016-03-18 13: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-03 18:39:02

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

代码语言:javascript
运行
AI代码解释
复制
this.setState({foo: 'bar'}, () => { 
    // Do something here. 
});

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

而不是:

代码语言:javascript
运行
AI代码解释
复制
this.setState({foo: "one"}, () => {
    this.setState({bar: "two"});
});

只需执行以下操作:

代码语言:javascript
运行
AI代码解释
复制
this.setState({
    foo: "one",
    bar: "two"
});
票数 178
EN

Stack Overflow用户

发布于 2016-03-18 14: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 08: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

复制
相关文章
react中setState是同步还是异步的
我们都知道,React框架是由数据来驱动视图变化的,基于状态的管理实现对组件的管理,也就是组件当中的state,通过setState方法来修改当前组件的state,以达到视图的变化。
OECOM
2020/07/01
1.3K0
React中的setState为什么是异步的?
不知道大家有没有过这个疑问,React 中 setState() 为什么是异步的?我一度认为 setState() 是同步的,知道它是异步的之后很是困惑,甚至期待 React 能出一个 setStateSync() 之类的 API。同样有此疑问的还有 MobX 的作者 Michel Weststrate,他认为经常听到的答案都很容易反驳,并认为这可能是一个历史包袱,所以开了一个 issue 询问真正的原因。最终这个 issue 得到了 React 核心成员 Dan Abramov 的回复,Dan 的回复表明这不是一个历史包袱,而是一个经过深思熟虑的设计。
beifeng1996
2022/12/19
1.5K0
React 的 setState 是同步还是异步?
如果是异步的,那应该打印的时候 count 还没修改,依然是 0,所以打印两次 0。
神说要有光zxg
2022/11/11
2.6K0
React 的 setState 是同步还是异步?
为什么vuex的Mutations是同步,而Actions是异步
vuex[1]的mutations与actions有什么区别,除了用法上mutation是同步,actions是异步,这里的同步与异步指的是commitordispatch?并不是,同步指mutati
Maic
2022/12/21
2.2K0
为什么vuex的Mutations是同步,而Actions是异步
setState 到底是同步的,还是异步的
这是一道变体繁多的面试题,在 BAT 等一线大厂的面试中考察频率非常高。首先题目会给出一个这样的 App 组件,在它的内部会有如下代码所示的几个不同的 setState 操作:
zz_jesse
2021/07/12
7040
setState 到底是同步的,还是异步的
setState 到底是同步的,还是异步的
这是一道变体繁多的面试题,在 BAT 等一线大厂的面试中考察频率非常高。首先题目会给出一个这样的 App 组件,在它的内部会有如下代码所示的几个不同的 setState 操作:
coder_koala
2021/07/08
7800
setState 到底是同步的,还是异步的
react的setState到底是同步还是异步
state = { number:1 }; componentDidMount(){ this.setState({number:3}) console.log(this.state.number) }
马克社区
2022/04/28
4380
面试官:react中的setState是同步的还是异步的
hello,这里是潇晨,大家在面试的过程是不是经常会遇到这样的问题,react的setState是同步的还是异步的,这个问题回答的时候一定要完整,来看下面这几个例子:
全栈潇晨
2021/12/15
9530
面试官:react中的setState是同步的还是异步的
hello,这里是潇晨,大家在面试的过程是不是经常会遇到这样的问题,react的setState是同步的还是异步的,这个问题回答的时候一定要完整,来看下面这几个例子:
长腿程序员165858
2022/12/16
6320
问:React的setState为什么是异步的?
不知道大家有没有过这个疑问,React 中 setState() 为什么是异步的?我一度认为 setState() 是同步的,知道它是异步的之后很是困惑,甚至期待 React 能出一个 setStateSync() 之类的 API。同样有此疑问的还有 MobX 的作者 Michel Weststrate,他认为经常听到的答案都很容易反驳,并认为这可能是一个历史包袱,所以开了一个 issue 询问真正的原因。最终这个 issue 得到了 React 核心成员 Dan Abramov 的回复,Dan 的回复表明这不是一个历史包袱,而是一个经过深思熟虑的设计。
beifeng1996
2022/10/01
9690
React中的setState的同步异步与合并
这篇文章主要是因为自己在学习React中setState的时候,产生了一些疑惑,所以进行了一定量的收集资料和学习,并在此记录下来
Qwe7
2022/06/09
9880
React中的setState的同步异步与合并
原理可以用这张图来描述,即在react中,setState通过一个队列机制实现state的更新。当执行setState时,会把需要更新的state合并后放入状态队列,而不会立刻更新this.state,当进入组件可更新状态时,这个队列机制就会高效的批量的更新state。
Qwe7
2022/06/09
1.6K0
[深度思考]·为什么CNN是同步(并行)而RNN是异步(串行)的呢?
个人主页--> https://xiaosongshine.github.io/
小宋是呢
2019/06/27
1.3K0
React 的 setState 同步还是异步
大家好,我是前端西瓜哥。今天来聊聊 React 的 setState 是同步还是异步的。
前端西瓜哥
2022/12/21
7350
setState同步异步场景
React通过this.state来访问state,通过this.setState()方法来更新state,当this.setState()方法被调用的时候,React会重新调用render方法来重新渲染UI。相比较于在使用Hooks完成组件下所需要的心智负担,setState就是在使用class完成组件下所需要的心智负担,当然所谓的心智负担也许叫做所必须的基础知识更加合适一些。
WindRunnerMax
2022/05/06
2.5K0
React中的setState是异步的吗?
在React中更新状态,一般的写法都是this.setState({a:1}),而非Vue那样this.a = 1。并且,如果在如下场景:
娜姐
2020/09/22
2.2K0
React中的setState是异步的吗?
React中的setState的同步异步与合并(2)
this.setState会通过引发一次组件的更新过程来引发重新绘制。也就是说setState的调用会引起React的更新生命周期的四个函数的依次调用:
Qwe7
2022/06/09
6800
React setState 是异步执行还是同步执行?
把 setState 放在定时器里就会同步更新。放在自定义事件函数里也会同步更新,例如:
多云转晴
2020/08/04
2.6K0
React setState 是异步执行还是同步执行?
第十一篇:setState 到底是同步的,还是异步的?
setState 对于许多的 React 开发者来说,像是一个“最熟悉的陌生人”:
越陌度阡
2021/11/02
1K0
React的useState和setState到底是同步还是异步呢?
这里跟useState不同,同步执行时useState也会对state进行逐个处理,而setState则只会处理最后一次
beifeng1996
2022/12/20
1.1K0

相似问题

Reactjs setState异步

30

如何使setState在Reactjs中同步运行?

48

异步回调的ReactJS setState

13

在Reactjs中是否有setState()的同步替代方案

136

reactjs --解决setState异步问题

327
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档