Skip to content

说一下 React setState 的过程

先说一下 setState

setState 的异步

js
constructor() {
  super()
  this.state = {
    list: ['a', 'b']
  }
}
addTitle(title) {  
  console.log(this.state.list) // ['a', 'b']
  this.setState({
    list: this.state.list.concat(title) // 'c'
  })
  console.log(this.state.list)
}

setState 为何需要异步

  • 可能会一次执行多次 setState
  • 无法得知用户何时使用 setState
  • 没必要每次 setState 都重新渲染,考虑性能

Vue 修改属性也是异步的

  • 效果、原因与 setState 一样
  • 对比记忆,印象深刻
  • 权当复习一下 vue 的渲染流程

setState 的过程

  • 每个组件实例,都有 renderComponent 方法
  • 执行 renderComponent 会重新执行实例的 render
  • render 函数返回 newVnode,然后拿到 preVnode
  • 执行 patch(preVnode, newVnode)

简单模拟一下此过程

js
class Component {
  constructor() {
    super()
  }
  renderComponent() {
    const preVnode = this._vnode
    const newVnode = this.render()
    patch(preVnode, newVnode)
    this._vnode = newVnode
  }
}

共 20 个模块,1301 篇 Markdown 文档。