美文网首页
VUE中nextTick实现原理

VUE中nextTick实现原理

作者: Small_Song | 来源:发表于2021-06-17 17:02 被阅读0次

    vue中有nextTick这个API,官方解释,它可以在DOM更新完毕之后执行一个回调。
    一般使用

    this.$nextTick(() => {
        ...
    })
    

    一般来说,在对于MVVM框架结构的技术栈是不推荐操作DOM的,但是很多情况下可能会需要操作DOM,特别是一些charts插件等。

    所以nextTick就出现了,确保我们所操作的DOM是更新之后的。
    那VUE是如何知道DOM什么时候更新完了呢?

    VUE源码:(把里面的注释都删掉了)

    if (typeof Promise !== 'undefined' && isNative(Promise)) {
      const p = Promise.resolve()
      timerFunc = () => {
        p.then(flushCallbacks)
        if (isIOS) setTimeout(noop)
      }
      isUsingMicroTask = true
    } else if (!isIE && typeof MutationObserver !== 'undefined' && (
      isNative(MutationObserver) ||
      MutationObserver.toString() === '[object MutationObserverConstructor]'
    )) {
      let counter = 1
      const observer = new MutationObserver(flushCallbacks)
      const textNode = document.createTextNode(String(counter))
      observer.observe(textNode, {
        characterData: true
      })
      timerFunc = () => {
        counter = (counter + 1) % 2
        textNode.data = String(counter)
      }
      isUsingMicroTask = true
    } else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
      timerFunc = () => {
        setImmediate(flushCallbacks)
      }
    } else {
      timerFunc = () => {
        setTimeout(flushCallbacks, 0)
      }
    }
    
    步骤:
    1. 先判断Promise
    2. 在判断MutationObserver
    3. 在判断setImmediate
    4. 最后setTimeout
    整体流程涉及到事件的循环(Event Loop)[暂不在这说]

    每次event loop的最后,会有一个UI render,也就是更新DOM
    只要让nextTick里的代码放在UI render步骤后面执行,就能访问到更新后的DOM了。

    又涉及到微任务(microtask)和宏任务(macrotask)
    microtask有:Promise、MutationObserver,以及nodejs中的process.nextTick
    macrotask有:setTimeout, setInterval, setImmediate, I/O, UI rendering
    每一次事件循环都包含一个microtask队列,在循环结束后会依次执行队列中的microtask并移除,然后再开始下一次事件循环。

    vue的nextTick方法的实现原理:
    1. vue用异步队列的方式来控制DOM更新和nextTick回调先后执行
    2. microtask因为其高优先级特性,能确保队列中的微任务在一次事件循环前被执行完毕
    3. 因为浏览器和移动端兼容问题,vue不得不做了microtask向macrotask的兼容(降级)方案

    相关文章

      网友评论

          本文标题:VUE中nextTick实现原理

          本文链接:https://www.haomeiwen.com/subject/blnoeltx.html