vue $nextTick实现原理深入详解

 更新时间:2023年10月08日 10:43:40   作者:光法V3  
这篇文章主要介绍了vue $nextTick实现原理深入详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

简介

鉴于一些朋友想学习 vue2 源码,但一看到源码就头痛(比如在下...),这里本着能给别人讲会,自己就能学会的态度,想开一个专题,旨在用最简单的代码 让感兴趣的朋友了解一些源码的设计思路(重在思路)。当然受限于在下技术水平,若有歧义或不正确的地方还望大佬们及时指正。

这一节主要讲一下$nextTick 如何实现的

nextTick 的作用

我们看一下这一段代码

当我们进入页面后 根据双向绑定原理(当然我们还没讲,如果这个文章反应好后面会补上)的知识 num 每次执行++ 时,其 setter 方法都会执行一次,而每次执行 setter 时,都会触发 watcher 的更新 dom 方法,那执行下来,dom 就会被更新 10000 次,很明显这样就太低效了。

经过简单思考我们就可以想到,虽然 num 被更新了 10000 次,但我们实际只想在最后一次更新后,执行 dom 的更新,那就意味着想要提升性能,dom 更新就不能是同步的,而应该等每次代码执行完毕后,把所有收集到的 watcher 进行去重,如演示代码中,应该在每次执行 num 的 setter 后,先把触发的 watcher 存入队列,等代码执行完毕后,对收集到的 watcher 进行去重,这里就只保留最后一次的 watcher 更新 dom 即可。

nextTick 的简单实现

解析

  • (1)首先,nextTick 函数将回调函数封装在一个新的函数中,并将该封装函数推入 callbacks 数组中。
  • (2)然后,它会检查 pending 的状态,如果为 false,则表示当前没有执行异步更新任务,需要进行异步更新。
  • (3)在异步更新中,它会根据浏览器支持情况选择使用宏任务(macro task)或微任务(micro task)。
    如果浏览器支持宏任务,macroTimerFunc 函数会被调用,将异步更新任务推入宏任务队列中,以便在下一个宏任务执行时执行回调函数。
    如果浏览器不支持宏任务,则会调用 microTimerFunc 函数,将异步更新任务推入微任务队列中,以便在下一个微任务执行时执行回调函数。
  • (4)最后,如果回调函数为 undefined,并且当前环境支持 Promise,则会返回一个 Promise 对象,以便可以使用 await 或 .then() 等方式等待回调函数执行完成。

以上就是vue $nextTick实现原理深入详解的详细内容,更多关于vue $nextTick实现的资料请关注脚本之家其它相关文章!

相关文章

  • vue实现大文件切片上传的示例详解

    vue实现大文件切片上传的示例详解

    前端上传文件很大时,会出现各种问题,比如连接超时了,网断了,都会导致上传失败,这个时候就需要将文件切片上传,下面我们就来学习一下如何使用vue实现大文件切片上传吧
    2023-11-11
  • Vue lazyload图片懒加载实例详解

    Vue lazyload图片懒加载实例详解

    本文通过实例代码给大家介绍了Vue lazyload图片懒加载的相关知识,通过导入配置等操作src/main.jswenj ,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-12-12
  • 详解Vue中keep-alive的使用

    详解Vue中keep-alive的使用

    keep-alive是Vue的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,而不是销毁,这篇文章主要介绍了详解Vue中keep-alive的使用,需要的朋友可以参考下
    2023-03-03
  • Bpmn.js 自定义描述文件使用说明

    Bpmn.js 自定义描述文件使用说明

    这篇文章主要为大家介绍了Bpmn.js 自定义描述文件使用说明,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • React之input动态取值和赋值方式

    React之input动态取值和赋值方式

    这篇文章主要介绍了React之input动态取值和赋值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • vue.js踩坑之ref引用细节点讲解

    vue.js踩坑之ref引用细节点讲解

    这篇文章主要介绍了vue.js踩坑之ref引用细节点讲解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • vue使用Google地图的实现示例代码

    vue使用Google地图的实现示例代码

    这篇文章主要介绍了vue使用Google地图的实现示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • Vue3+Canvas实现坦克大战游戏(一)

    Vue3+Canvas实现坦克大战游戏(一)

    这篇文章将利用Vue3和Canvas编写一个童年经典游戏—坦克大战,文中的示例代码讲解详细,感兴趣的小伙伴快来跟随小编一起学习一下吧
    2022-03-03
  • 详解Vue中的scoped及穿透方法

    详解Vue中的scoped及穿透方法

    这篇文章主要介绍了Vue中的scoped及穿透方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • vue中添加与删除关键字搜索功能

    vue中添加与删除关键字搜索功能

    这篇文章主要介绍了vue中添加与删除,关键字搜索功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10

最新评论