React源码学习之UpdateQueue(单链表)

对UpdateQueue的产生和使用有所疑问,所以模拟一下。

// 创建一个更新
function createUpdate(expirationTime) {
  return {
    expirationTime: expirationTime,

    tag: 0,
    payload: null,
    callback: null,

    next: null,
    nextEffect: null,
  };
}
// 创建一个包含各个Update的单向链表
function createUpdateQueue(baseState) {
  const queue = {
    baseState,
    firstUpdate: null,
    lastUpdate: null,
    firstCapturedUpdate: null,
    lastCapturedUpdate: null,
    firstEffect: null,
    lastEffect: null,
    firstCapturedEffect: null,
    lastCapturedEffect: null,
  };
  return queue;
}
// 添加 update对象 到 单向链表中
function appendUpdateToQueue(
  queue,update
) {
  
  // Append the update to the end of the list.
  if (queue.lastUpdate === null) {
    // Queue is empty
    // firstUpdate和lastUpdate都保存的是 update这个对象的引用
    queue.firstUpdate = queue.lastUpdate = update;
  } else {·  
    // 当firstUpdate和lastUpdate相同的情况下,修改lastUpdate的next值其实就是修改了firstUpdate的next值。在取值的时候也是一直从firstUpdate取next,取到最后一个节点为止。
    queue.lastUpdate.next = update;
    // 然后queue的lastUpadate就指向这个新的update
    queue.lastUpdate = update;
  }
}

下面模拟一下Update创建并且加入到单向链表UpdateQueue中,首先创建一个UpdateQueue。

var queue = createUpdateQueue({})

创建三个Update

var update1 = createUpdate(1)
var update2 = createUpdate(2)
var update3 = createUpdate(3)

依次连接起来

appendUpdateToQueue(queue, update1)
appendUpdateToQueue(queue, update2)
appendUpdateToQueue(queue, update3)

看一下queue

console.log('qeueu', queue)

从fitstUpdate开始,以next连接每一个Update


queue

需要调用的时候就这样做,下例是打出链表所有的nextNodeExpirationTime

function LoopQueue () {
  let firstUpdate = queue.firstUpdate
  if (!firstUpdate ) {
    console.error('该链表为空')
    return
  }
  let currentNode = firstUpdate 
  console.log('nextNodeExpirationTime', firstUpdate .expirationTime)
  while (currentNode.next){
    let nextNode = currentNode.next
    console.log('nextNodeExpirationTime', nextNode.expirationTime)
   currentNode = currentNode.next
  }
}
LoopQueue()
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本文来自本人著作《趣学数据结构》 链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不一定相邻,那么...
    rainchxy阅读 9,193评论 6 20
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,887评论 1 32
  • 如需转载, 请咨询作者, 并且注明出处.有任何问题, 可以关注我的微博: coderwhy, 或者添加我的微信: ...
    coderwhy阅读 12,409评论 1 31
  • 木夕星夜阅读 45评论 0 2
  • 今天还是和我相处了两年多的女朋友分手了。两年的时间说长也不长,但是你若回想,才发现留给你的记忆却是山呼海啸。...
    猪小豌阅读 3,177评论 0 2

友情链接更多精彩内容