-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
面试官:说说 React中的setState执行机制 #185
Comments
React18之后setState默认异步更新,可以使用flushSync开启同步更新。 |
在setTimeout或者原生dom事件中,setState也是异步吗 |
测试,在18中,setTimeout中也是异步的 |
在 18 中hooks 好像全是异步的,哪怕是我这样处理,打印出来的还是 Hello World |
state 相当于一个静态快照,所以在setState调用的之前或之后,想要获取state的值,都是当前的状态值 |
React18之后,setState都是异步(无论是在定时器还是生命周期函数里) |
测试结果,react18的Concurrent Mode下,所有setState都会是异步的,走到批处理的逻辑 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
一、是什么
一个组件的显示形态可以由数据状态和外部参数所决定,而数据状态就是
state
当需要修改里面的值的状态需要通过调用
setState
来改变,从而达到更新组件内部数据的作用如下例子:
通过点击按钮触发
onclick
事件,执行this.setState
方法更新state
状态,然后重新执行render
函数,从而导致页面的视图更新如果直接修改
state
的状态,如下:我们会发现页面并不会有任何反应,但是
state
的状态是已经发生了改变这是因为
React
并不像vue2
中调用Object.defineProperty
数据响应式或者Vue3
调用Proxy
监听数据的变化必须通过
setState
方法来告知react
组件state
已经发生了改变关于
state
方法的定义是从React.Component
中继承,定义的源码如下:从上面可以看到
setState
第一个参数可以是一个对象,或者是一个函数,而第二个参数是一个回调函数,用于可以实时的获取到更新之后的数据二、更新类型
在使用
setState
更新数据的时候,setState
的更新类型分成:异步更新
先举出一个例子:
从上面可以看到,最终打印结果为
Hello world
,并不能在执行完setState
之后立马拿到最新的state
的结果如果想要立刻获取更新后的值,在第二个参数的回调中更新后会执行
同步更新
同样先给出一个在
setTimeout
中更新的例子:上面的例子中,可以看到更新是同步
再来举一个原生
DOM
事件的例子:小结
三、批量更新
同样先给出一个例子:
点击按钮触发事件,打印的都是 1,页面显示
count
的值为 2对同一个值进行多次
setState
,setState
的批量更新策略会对其进行覆盖,取最后一次的执行结果上述的例子,实际等价于如下:
由于后面的数据会覆盖前面的更改,所以最终只加了一次
如果是下一个
state
依赖前一个state
的话,推荐给setState
一个参数传入一个function
,如下:而在
setTimeout
或者原生dom
事件中,由于是同步的操作,所以并不会进行覆盖现象参考文献
The text was updated successfully, but these errors were encountered: