Skip to content

Latest commit

 

History

History

beginWork

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
function beginWork(workInProgress) {
  let next = null
  let tag = workInProgress.tag

  if (workInProgress.alternate !== null) {
    let oldProps = workInProgress.alternate.memoizedProps
    let newProps = workInProgress.pendingProps
    // 每个current也就是每个fiber都有自己的expirationTime
    // 这个expirationTime是当执行setState的时候在通过实例找root的那个函数中
    // 会把新计算出来的expirationTime放在那个类的fiber上
    // 然后在最后任务执行完了就会把那个fiber的expirationTime重置为NoWork
    // 所以这里的updateExpirationTime得到的很可能是0 如果这个fiber上没有更新的话那就会是0
    // 因为在createWorkInProgress的时候会将current.expirationTime赋值给workInProgress.expirationTime
    // 而renderExpirationTime则是root.nextExpirationTimeToWorkOn给赋值的全局变量 是当前任务的更新时间
    // 所以如果某个fiber上的updateExpirationTime是0就会小于renderExpirationTime也就会执行下面那个跳过更新的逻辑
    if (oldProps === newProps && workInProgress.expirationTime < nextRenderExpirationTime && workInProgress.tag !== ContextConsumer) {
      // 这个函数用来跳过本fiber的更新的方法
      // 如果当前workInProgress没有子节点就返回个null 如果有子节点就返回一个子节点的克隆
      return bailoutOnAlreadyFinishedWork(workInProgress)
    }
  }

  if (tag === IndeterminateComponent) {
    // tag默认是indeterminate类型
    // 初次渲染时的function类型组件会走这里离
    // 因为不确定function的返回值会是啥玩意儿
    // 根据函数的返回值 会在这个方法中确定workInProgress的tag类型
    next = mountIndeterminateComponent(workInProgress)
  } else if (tag === HostRoot) {
    next = updateHostRoot(workInProgress)
  } else if (tag === FunctionComponent) {

  } else if (tag === ClassComponent) {
    next = updateClassComponent(workInProgress)
  } else if (tag === HostComponent) {
    next = updateHostComponent(workInProgress)
  } else if (tag === HostText) {
    next = updateHostText(workInProgress)
  } else if (tag === ContextProvider) {
    next = updateContextProvider(workInProgress)
  } else if (tag === ContextConsumer) {
    next = updateContextConsumer(workInProgress)
  }
  // 当前这个workInProgress马上就要更新完了 所以可以把它的expirationTime置为NoWork了
  workInProgress.expirationTime = NoWork
  return next
}