State是React能够识别的数据结构状态。
从上面的截图可以看出SiderBar组件中的State数据以及改变他们的setState方法,是以闭包的形式存放在SiderBar组件(本质也是一个函数)里的。
调用栈的变化过程
第一轮调用栈,创建state更新的调度任务
关键函数makeStateUpdateScheduled
第二轮调用栈,标记render开始
关键函数makeRenderStarted
第三轮调用栈,标记组件render开始
关键函数makeComponentRenderStarted
第四轮调用栈,Index组件执行
第五轮调用栈,setStrictMode,isStrictMode的值为true
第六轮调用栈,Index又执行
第七轮调用栈,又setStrictMode,isStrictMode的值为false
第八轮调用栈,标记组件render结束
关键函数makeComponentRenderStopped
第九轮调用栈,标记render结束
关键函数makeRenderStopped
第十轮调用栈,标记commit开始
关键函数makeCommitStarted
第十一轮调用栈,标记layoutEffect开始
关键函数makeLayoutEffectsStarted
第十二轮调用栈,标记layoutEffect结束
关键函数makeLayoutEffectsStopped
第十三轮调用栈,hook.onCommitFiberRoot被调用
关键函数hook.onCommitFiberRoot
第十四轮调用栈,标记commit结束
关键函数makeCommitStopped
信息汇总
- 从调用栈方法可以看出,state变化,react并不是立即更新,而是创建了调度任务,在浏览器空闲时才执行更新
- 先更新了一些状态信息,接下来组件函数才会执行,创建新的Element
- 先是render阶段(找到变化的元素),再到commit阶段(执行变化过程)
- useLayoutEffect 将会在浏览器重新绘制视图前执行