首页 > 软件开发 > JavaScript >

Vue.nextTick 的实现方法

来源:互联网 2023-03-16 23:57:27 版权归原作者所有,如有侵权,请联系我们

event loop和MicroTask 后的vue.nextTick API实现的源码解析。aFb办公区 - 实用经验教程分享!

工具/原料

  • JavaScript

方法/步骤

  • 1

    预热,写一个sleep函数。aFb办公区 - 实用经验教程分享!

    Vue.nextTick 的实现方法aFb办公区 - 实用经验教程分享!

  • 2

    解释下sleep函数aFb办公区 - 实用经验教程分享!

    async 函数进行await PromiseFn()时函数执行是暂停的,我们也知道现在这个PromiseFn是在microTask内执行。当microTask没执行完毕时,后面的macroTask是不会执行的,我们也就通过microTask在event loop的特性实现了一个sleep函数,阻止了console.log的执行aFb办公区 - 实用经验教程分享!

    流程aFb办公区 - 实用经验教程分享!

    1、执行console.log('start')2、执行await 执行暂停,等待await函数后的PromiseFn在microTask执行完毕3、在sleep函数内,延迟ms返回4、返回resolve后执行console.log('end')aFb办公区 - 实用经验教程分享!

    nextTick APIaFb办公区 - 实用经验教程分享!

    vue中nextTick的使用方法aFb办公区 - 实用经验教程分享!

    Vue.nextTick 的实现方法aFb办公区 - 实用经验教程分享!

  • 3

    了解用法后看一下源码。aFb办公区 - 实用经验教程分享!

    Vue.nextTick 的实现方法aFb办公区 - 实用经验教程分享!

    Vue.nextTick 的实现方法aFb办公区 - 实用经验教程分享!

  • 3相关内容未经许可获取自百度经验
  • 4

    大致看一下源码可以了解到nextTick api是一个自执行函数aFb办公区 - 实用经验教程分享!

    既然是自执行函数,直接看它的return类型,return function queueNextTick (cb, ctx) {...}aFb办公区 - 实用经验教程分享!

    Vue.nextTick 的实现方法aFb办公区 - 实用经验教程分享!

  • 5

    只关注主流程queueNextTick函数把我们传入的() => { // todo... } 推入了callbacks内aFb办公区 - 实用经验教程分享!

    Vue.nextTick 的实现方法aFb办公区 - 实用经验教程分享!

  • 6

    这一段可以看到标注的三个点表明在不同浏览器环境下使用Promise, MutationObserver或setTimeout(fn, 0) 来执行nextTickHandleraFb办公区 - 实用经验教程分享!

    Vue.nextTick 的实现方法aFb办公区 - 实用经验教程分享!

  • 7

    nextTickHandler就是把之前放入callbacks的 () => { // todo... } 在当前tasks内执行。aFb办公区 - 实用经验教程分享!

    写一个简单的nextTickaFb办公区 - 实用经验教程分享!

    源码可能比较绕,写一段简单的nextTickaFb办公区 - 实用经验教程分享!

    Vue.nextTick 的实现方法aFb办公区 - 实用经验教程分享!

  • 8

    可以从这里看出nextTick的原理就是返回出一个Promise,而我们todo的代码在这个Promise中执行,现在我们还可以继续简化aFb办公区 - 实用经验教程分享!

    Vue.nextTick 的实现方法aFb办公区 - 实用经验教程分享!

  • 9

    直接写成这样。aFb办公区 - 实用经验教程分享!

    Vue.nextTick 的实现方法aFb办公区 - 实用经验教程分享!

  • 10

    现在直接简化到最后,现在发现nextTick最核心的内容就是Promise,一个microtask。aFb办公区 - 实用经验教程分享!

    现在回到vue的nextTick API官方示例aFb办公区 - 实用经验教程分享!

    Vue.nextTick 的实现方法aFb办公区 - 实用经验教程分享!

  • 11

    原来在vue内数据的更新后dom更新是要在下一个事件循环后执行的。nextTick的使用原则主要就是解决单一事件更新数据后立即操作dom的场景。aFb办公区 - 实用经验教程分享!

    知道了nextTick核心是利用microTasks,那么把简化过的nextTick和开头的sleep函数对照一下。aFb办公区 - 实用经验教程分享!

    Vue.nextTick 的实现方法aFb办公区 - 实用经验教程分享!

  • 12

    看出nextTick和我么写的oneTick的执行结果是那么的相似。区别只在于nextTick是把callback包裹一个Promise返回并执行,而oneTick是用await执行一个Promise函数,而这个Promise有自己包裹的webapi函数。aFb办公区 - 实用经验教程分享!

    那在用ajax请求的时候我们是不是直接这样使用axios可以返回Promise的库aFb办公区 - 实用经验教程分享!

    Vue.nextTick 的实现方法aFb办公区 - 实用经验教程分享!

  • 13

    这样也可以达到同nextTick同样的作用aFb办公区 - 实用经验教程分享!

    最后也可以从源码中看出,当浏览器环境不支持Promise时可以使用MutationObserver或setTimeout(cb, 0) 来达到同样的效果。但最终的核心是microTaskaFb办公区 - 实用经验教程分享!

  • 以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!aFb办公区 - 实用经验教程分享!


    标签: JAVASCRIPT

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号