vue nextTick源码原理分析

13 篇文章 0 订阅

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

  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)
    });
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值