You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Component.prototype.setState=function(partialState,callback){invariant(typeofpartialState==='object'||typeofpartialState==='function'||partialState==null,'setState(...): takes an object of state variables to update or a '+'function which returns an object of state variables.',);this.updater.enqueueSetState(this,partialState,callback,'setState');};
面试官:说说 React中的setState执行机制
state
一个组件的显示形态可以由数据状态和外部参数所决定,而数据状态就是
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: