vue nextTick源码原理分析

13 篇文章 0 订阅
本文探讨了JavaScript中处理异步操作的方式,通过Promise、MutationObserver、setImmediate等技术实现回调函数的延迟执行。核心是nextTick函数,它用于将回调添加到任务队列并在当前执行栈结束后执行,确保了异步执行的顺序。
摘要由CSDN通过智能技术生成

为了简化便于理解,做了源码的部分省略,更多请查看源码

  const callBacks = []; //收集回调函数
    let open = false; // 门闩开关
    let timerFunc = null;


    function timerFuncHandler() { // 执行回调函数
      open = false;
      callBacks.forEach(fn => {
        fn()
      });
      callBacks.length = 0; //置空
    };


    if (typeof Promise !== "undefined") {
      const p = Promise.resolve()
      timerFunc = function () {
        p.then(timerFuncHandler);
      };
    } else if (typeof MutationObserver !== "undefined") {

      var num = 1;
      var observer = new MutationObserver(timerFuncHandler);
      var textNode = document.createTextNode(num + '');
      observer.observe(textNode, {
        characterData: true // 监测到文本数据变化
      })
      num = (num + 1) % 2; // 修改值
      textNode.data = num; // 更新数据,以此来触发observer.observe函数的监听

    } else if (typeof setImmediate !== 'undefined') {
      timerFunc = () => {
        setImmediate(flushCallbacks)
      }
    } else {
      timerFunc = () => {
        setTimeout(flushCallbacks, 0)
      }
    };

    function nextTick(cb, ctx) {
      callBacks.push(() => { //收集回调
        cb && cb.call(ctx);
      });

      if (!open) { // 关闭门闩
        open = true;
        timerFunc()//执行主句进程收集的函数
      }
    };

    nextTick(function () {
      console.log(12)
    });

    nextTick(function () {
      console.log(102)
    });
Vue.nextTick()的实现原理是将回调函数推入到一个队列中,在下一个事件循环周期(MacroTask)中执行这个队列中的所有回调函数。具体来说,当用户使用Vue.nextTick()执行回调函数时,Vue.js会按照以下步骤进行处理:\[2\] 1. 将回调函数推入到一个队列中。 2. 在下一个事件循环周期中,执行队列中的所有回调函数。 3. 这样可以确保在DOM更新后执行回调函数,以便获取最新的DOM状态。 Vue使用异步队列的方式来控制DOM更新和nextTick回调的先后执行。由于MicroTask具有高优先级特性,Vue将回调函数放入MicroTask队列中,以确保在一次事件循环前被执行完毕。为了兼容性问题,Vue还实现了MicroTask向MacroTask的降级方案,以确保回调函数的执行顺序正确。\[3\] #### 引用[.reference_title] - *1* *2* [vue nextTick原理详解](https://blog.csdn.net/qq_34185872/article/details/130221892)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [vue的nextTick原理](https://blog.csdn.net/chenzeze0707/article/details/90083725)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值