首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

问:React的setState为什么是异步的?

前言不知道大家有没有过这个疑问,React 中 setState() 为什么是异步的?...我一度认为 setState() 是同步的,知道它是异步的之后很是困惑,甚至期待 React 能出一个 setStateSync() 之类的 API。...正文Dan 在回复中表示为什么 setState() 是异步的,这并没有一个明显的答案(obvious answer),每种方案都有它的权衡。...但是 React 的设计有以下几点考量:一、保证内部的一致性首先,我想我们都同意推迟并批量处理重渲染是有益而且对性能优化很重要的,无论 setState() 是同步的还是异步的。...现在的设计保证了 React 提供的 objects(state,props,refs)的行为和表现都是一致的。为什么这很重要?

94810

React中的setState为什么是异步的?

前言不知道大家有没有过这个疑问,React 中 setState() 为什么是异步的?...我一度认为 setState() 是同步的,知道它是异步的之后很是困惑,甚至期待 React 能出一个 setStateSync() 之类的 API。...正文Dan 在回复中表示为什么 setState() 是异步的,这并没有一个明显的答案(obvious answer),每种方案都有它的权衡。...但是 React 的设计有以下几点考量:一、保证内部的一致性首先,我想我们都同意推迟并批量处理重渲染是有益而且对性能优化很重要的,无论 setState() 是同步的还是异步的。...现在的设计保证了 React 提供的 objects(state,props,refs)的行为和表现都是一致的。为什么这很重要?

1.5K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    问:React的setState为什么是异步的?_2023-03-01

    前言 不知道大家有没有过这个疑问,React 中 setState() 为什么是异步的?...我一度认为 setState() 是同步的,知道它是异步的之后很是困惑,甚至期待 React 能出一个 setStateSync() 之类的 API。...正文 Dan 在回复中表示为什么 setState() 是异步的,这并没有一个明显的答案(obvious answer),每种方案都有它的权衡。...但是 React 的设计有以下几点考量: 一、保证内部的一致性 首先,我想我们都同意推迟并批量处理重渲染是有益而且对性能优化很重要的,无论 setState() 是同步的还是异步的。...现在的设计保证了 React 提供的 objects(state,props,refs)的行为和表现都是一致的。为什么这很重要?

    80750

    深入理解react的setState

    我试着分别在这几个生命周期函数中setState了一下,发现在componentWillUpdate、render、componentDidUpdate 中会报错,也就是说在componentWillUpdate...1.那么问题来了这些周期方法为什么不可以setState? 2.setState异步机制,怎么处理,setState(函数)?...参考链接 参考链接 连续调用了多次setState,但是只引发了一次更新生命周期,因为React会将多个this.setState产生的修改放在一个队列里,缓一缓,攒在一起,觉得差不多了在引发一次更新过程...所以攒的过程中如果你不停的set同一个state的值,只会触发最后一次,例如上面那道题 那么问题又来了:我就想让第三次输出为3,别给我覆盖掉该怎么办?...我理解这个state其实就相当于一个全局变量,每次累加的不是this.state,而是state这个变量,所以无论累加多少次,最后将state这个变量赋值给this.state。

    94320

    React 的 setState 同步还是异步

    大家好,我是前端西瓜哥。今天来聊聊 React 的 setState 是同步还是异步的。...Sync Mode 其实 React 官方叫 Legacy Mode(Legacy 表示过时的),但为了更好地表示这种模型的特性,我还是将它叫做 Sync(同步) Mode。...分为两种情况讨论: React 的流程中的 setState,我们。比如生命周期函数、React 的事件响应函数; 游离在 React 控制之外的 setState。...结尾 总结一下,同步模式(sync)下,React 流程中的 setState 更新操作是批量延迟同步的,流程外的 setState 是立即同步执行的。...使用并发模式(concurrent)下,使用了全新的 Fiber 架构,setState 的更新是异步的。 我是前端西瓜哥,欢迎关注我,学习更多前端知识。 ----

    71130

    React中的setState是异步的吗?

    在React中更新状态,一般的写法都是this.setState({a:1}),而非Vue那样this.a = 1。...其实,这只是React的障眼法。 setState是同步执行的!但是state并不一定会同步更新(异步更新和同步更新都存在) 1....React.setState()中的异步更新 setState()中有个特别重要的布尔属性isBatchingUpdates(默认为false,),它决定了state是同步更新还是异步更新。...调用栈如下(涉及到React事务机制,可以参考文章《React进阶篇(四)事务》): ? setState调用.png setState 只在合成事件和钩子函数中是“异步更新”的。...React.setState()中的同步更新 当然,也是有办法同步获取state更新后的值: setTimeout等异步操作中调用setState函数 DOM原生事件 利用setState回调函数 函数式

    2.2K10

    react中setState是同步还是异步的

    我们都知道,React框架是由数据来驱动视图变化的,基于状态的管理实现对组件的管理,也就是组件当中的state,通过setState方法来修改当前组件的state,以达到视图的变化。...看到这里很多人会感到不理解,做过一段时间react开发的都应该清楚setState之后直接输出state值是不会改变的,但是为什么setTimeout中的setState就可以呢?下面我们来看一下。...setState的批量更新 有很多人说setState是异步更新的,我觉得这种说法是不准确的,严格来讲setState应该属于是批量更新。...setState批量更新节点 在React的setState函数实现中,会根据一个变量 isBatchingUpdate 来判断是直接同步更新this.state还是放到队列中异步更新 。...React使用了事务的机制,React的每个生命周期和合成事件都处在一个大的事务当中。

    1.3K20

    React中的setState的同步异步与合并

    前言 这篇文章主要是因为自己在学习React中setState的时候,产生了一些疑惑,所以进行了一定量的收集资料和学习,并在此记录下来 引入 使用过React的应该都知道,在React中,一个组件中要读取当前状态需要访问...中的Object.defineProperty或者Vue3中的Proxy的方式来监听数据的变化; 我们必须通过setState来告知React数据已经发生了变化; 疑惑:在组件中并没有实现setState...的方法,为什么可以调用呢?...Hello World } 最终打印结果是Hello World; 可见setState是异步的操作,我们并不能在执行完setState之后立马拿到最新的state的结果 为什么setState设计为异步呢.../facebook/react/issues/11527#issuecomment-360199710; 我对其回答做一个简单的总结: setState设计为异步,可以显著的提升性能; 如果每次调用 setState

    96120

    React中的setState的同步异步与合并

    原理图 图片 原理可以用这张图来描述,即在react中,setState通过一个队列机制实现state的更新。...也就是前言中的那题的来源 2.异步函数和原生事件中 由执行机制看,setState本身并不是异步的,而是如果在调用setState时,如果react正处于更新过程,当前更新会被暂存,等上一次更新执行后在执行...由上面的流程图很容易发现,在它们里面调用setState会造成死循环,导致程序崩溃。...你的答案是否正确?你又是否理解为什么会出现上面的答案?接下来我们就来仔细分析一下。...因为上面我们说过的执行顺序的关系,再经过【d,e】两次 setState ,所以 count 变成了3。 那么在【3】中打印出4又是为什么?

    1.6K30

    React 中的useState 和 setState 的执行机制

    React 中的useState 和 setState 的执行机制 useState 和 setState 在React开发过程中 使用很频繁,但很多人都停留在简单的使用阶段,并没有正在了解它们的执行机制...假如在一个「合成事件」中,循环调用了setState方法n次,如果 React 没有优化,当前组件就要被渲染n次,这对性能来说是很大的浪费。...所以,React 为了性能原因,对调用多次setState方法合并为一个来执行。当执行setState的时候,state中的数据并不会马上更新。 光怎么说肯定不容易理解,我们来通过几个案例来说明吧。...1:1 2: 0 那么问题来了,为什么在setCount之后输出的是2:0而不是2:1 因为function state 保存的是快照,class state 保存的是最新值。...我在 state 里面设置一个对象好不好?

    3.2K20

    react的setState到底是同步还是异步

    react框架本身的性能机制所导致的。...显然,React也是想到了这个问题,因此对setState做了一些特殊的优化: React会将多个setState的调用合并为一个来执行,也就是说,当执行setState的时候,state中的数据并不会马上更新...setTimeout 上面我们讲到了,setState本身并不是一个异步方法,其之所以会表现出一种异步的形式,是因为react框架本身的一个性能优化机制。...那么基于这一点,如果我们能够越过react的机制,是不是就可以令setState以同步的形式体现了呢?...这也完美的印证了我们的猜想是正确的。 原生事件中修改状态 上面已经印证了避过react的机制,可以同步获取到更新之后的数据,那么除了setTimeout以外,还有在原生事件中也是可以的。

    42830

    React循环DOM时为什么需要添加key

    一、React 渲染流程和更新流程react渲染流程:jsx -> 虚拟dom -> 真实domreact更新流程:props/state改变 -> render函数重新执行 -> 生成新的虚拟dom树...,那么即使是最先进的算法,该算法的复杂程度为 O(n3),其中 n 是树中元素的数量,如果在React中使用了该算法,那么展示1000个元素所需要执行的计算量将在十亿的量级范围,这个开销太过昂贵了,React...>2-2 对比同一类型的元素当比对两个相同类型的 React 元素时,React 会保留 DOM 节点,仅比对及更新有改变的属性比如下面的代码更改:通过比对这两个元素,React 知道只需要修改 DOM...:当更新 style 属性时,React 仅更新有所更变的属性。...button onClick={(e) => this.insertMovie()}>添加电影 ); } insertMovie() { this.setState

    83450

    React循环DOM时为什么需要添加key

    一、React 渲染流程和更新流程react渲染流程:jsx -> 虚拟dom -> 真实domreact更新流程:props/state改变 -> render函数重新执行 -> 生成新的虚拟dom树...,那么即使是最先进的算法,该算法的复杂程度为 O(n3),其中 n 是树中元素的数量,如果在React中使用了该算法,那么展示1000个元素所需要执行的计算量将在十亿的量级范围,这个开销太过昂贵了,React...>2-2 对比同一类型的元素当比对两个相同类型的 React 元素时,React 会保留 DOM 节点,仅比对及更新有改变的属性比如下面的代码更改:通过比对这两个元素,React 知道只需要修改 DOM...:当更新 style 属性时,React 仅更新有所更变的属性。...button onClick={(e) => this.insertMovie()}>添加电影 ); } insertMovie() { this.setState

    59810

    React在循环DOM的时候为什么需要添加key

    一、React 渲染流程和更新流程react渲染流程:jsx -> 虚拟dom -> 真实domreact更新流程:props/state改变 -> render函数重新执行 -> 生成新的虚拟dom树...,那么即使是最先进的算法,该算法的复杂程度为 O(n3),其中 n 是树中元素的数量,如果在React中使用了该算法,那么展示1000个元素所需要执行的计算量将在十亿的量级范围,这个开销太过昂贵了,React...>2-2 对比同一类型的元素当比对两个相同类型的 React 元素时,React 会保留 DOM 节点,仅比对及更新有改变的属性比如下面的代码更改:通过比对这两个元素,React 知道只需要修改 DOM...:当更新 style 属性时,React 仅更新有所更变的属性。...button onClick={(e) => this.insertMovie()}>添加电影 ); } insertMovie() { this.setState

    92120

    React-setState函数必须掌握的pendingState状态

    记录问题 异步更新原则 当然我们都清楚setState函数是react将对组件的state更改排入队列进行批量更新。...怎么会这样,按照我的理解,不是说好了批量更新策略,即使在setTimeout之后,下一个队列中应该也是批量呀。这是什么操作,为什么会这样。不行我要翻出来看看!...为什么会这样。。 我们来看看这段伪代码,非常精简的react关于setState的解析,当然再高深了我也不会,我也写不出来。...setState(callback) react官方提供一种setState直接传入一个callback的写法。...也就是它将在 setState完成合并并重新渲染组件后执行`。 这是和上边两种写法执行实际的不同。 写在结尾 当然我对于react的探索还在继续深入,也许之后在翻回来会发现有一部分的理解很片面。

    1.2K10
    领券