setState
关于 setState()
你应该了解三件事:
- 不要直接修改 State
1 | // Wrong |
- State 的更新可能是异步的
出于性能考虑,React 可能会把多个 setState()
调用合并成一个调用。
因为 this.props
和 this.state
可能会异步更新,所以你不要依赖他们的值来更新下一个状态。
1 | // Wrong |
- State 的更新会被合并
1 | componentDidMount() { |
例子
1 | <html> |
触发点击事件
1 | Component.prototype.setState = function (partialState, callback) { |
当点击事件触发完之后进入 performWork 调用,之后进入 workLoop 。最后再做更新操作。
异步更新例子
1 | ... |
触发点击事件,进入 setState 调用后进入 enqueueUpdate 方法
1 | function enqueueUpdate(fiber, update) { |
- 第一次调用,走这条分支
1 | function enqueueUpdate(fiber, update) { |
- 第二次调用
1 | function enqueueUpdate(fiber, update) { |
- 第三次调用,与第二次类似。最后 queue1.firstUpdate.next 有 n 个 next 组成一条链
之后进入 workLoop,在这里整合之前 setState 的操作。是个循环取 queue1.firstUpdate 的 next 属性,一直取到为 null
1 | function processUpdateQueue(workInProgress, queue, props, instance, renderExpirationTime) { |
之后走更新的流程
同步更新例子
1 | ... |
进入 setState 调用,前面都类似,进入 scheduleWork
1 | function scheduleWork(fiber, expirationTime) { |
进入 workLoop 后,在 processUpdateQueue 里的 getStateFromUpdate 方法
1 | function getStateFromUpdate(workInProgress, queue, update, prevState, nextProps, instance) { |
之后走到更新流程