在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。

疑问:

DOM 更新循环是指什么?

下次更新循环是什么时候?

修改数据之后使用,是加快了数据更新进度吗?

在什么情况下要用到?

原理

Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新。

在 Vue 的文档中,说明 Vue 是异步执行 DOM 更新的。

具体来说,异步执行的运行机制如下。

(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。

(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。

(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。

(4)主线程不断重复上面的第三步。

简单来说,Vue 在修改数据后,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图更新。

//改变数据
vm.message = 'changed'//想要立即使用更新后的DOM。这样不行,因为设置message后DOM还没有更新
console.log(vm.$el.textContent) // 并不会得到'changed'//这样可以,nextTick里面的代码会在DOM更新后执行
Vue.nextTick(function(){console.log(vm.$el.textContent) //可以得到'changed'
})

第一个 tick(图例中第一个步骤,即'本次更新循环'):

1.首先修改数据,这是同步任务。同一事件循环的所有的同步任务都在主线程上执行,形成一个执行栈,此时还未涉及 DOM 。2.Vue 开启一个异步队列,并缓冲在此事件循环中发生的所有数据改变。如果同一个 watcher 被多次触发,只会被推入到队列中一次。

第二个 tick(图例中第二个步骤,即'下次更新循环'):

同步任务执行完毕,开始执行异步 watcher 队列的任务,更新 DOM 。Vue 在内部尝试对异步队列使用原生的 Promise.then 和 MessageChannel 方法,如果执行环境不支持,会采用 setTimeout(fn, 0) 代替。

第三个 tick(图例中第三个步骤):

此时就是文档所说的:下次 DOM 更新循环结束之后。

此时通过 Vue.nextTick 获取到改变后的 DOM 。通过 setTimeout(fn, 0) 也可以同样获取到。

Vue的批量更新原理

Vue使用nextTick的原因和作用相关推荐

  1. Vue中$nextTick的理解

    Vue中$nextTick的理解 Vue中$nextTick方法将回调延迟到下次DOM更新循环之后执行,也就是在下次DOM更新循环结束之后执行延迟回调,在修改数据之后立即使用这个方法,能够获取更新后的 ...

  2. vue的$nextTick使用总结,this.$refs为undefined的解决办法,element Ui的树形控件setCheckedKeys方法无法使用

    vue的$nextTick使用总结,this.$refs为undefined的解决办法,element Ui的树形控件setCheckedKeys方法无法使用 参考文章: (1)vue的$nextTi ...

  3. 单例模式、使用getInstance()方法的原因及作用

    先举例说明: 下面是一个例子,为什么要把这个类实例化?有什么好处? //实例化 public static DBConnect instance;public static DBConnect get ...

  4. 【Vue2.0】—Vue中的key有什么作用?(四)

    [Vue2.0]-Vue中的key有什么作用?(四) <div id="root"><!-- 遍历数组 --><ul><button @c ...

  5. vue中nextTick的实际应用

    vue中nextTick的实际应用 简单来说就是:页面数据渲染完成之后再调用 在使用Vue框架的时候,有时候需要在Vue在页面数据渲染完成之后调用方法,不然获取不到准确的数据,特别是在获取列表的高度的 ...

  6. 26.Vue列表渲染中key的作用与原理(内含虚拟DOM的对比算法详解)

    目录 1.暴露问题,使用index作为key 2.使用唯一标识p.id作为key 3.不写key的配置 4.key的工作原理及虚拟DOM的对比算法 5.总结 25.Vue列表渲染_爱米酱的博客-CSD ...

  7. 双十一,打包半价理解Vue的nextTick与watcher以及Dep的蓝色生死恋?

    Vue之nextTick理解 前言 一开始就只想搞清楚nextTick的一个原理,谁知道,跟吃了辣条一下,停不下来,从nextTick的源码到Watcher源码再到Dep源码,震惊,然后再结合自己之前 ...

  8. 关于Vue中nextTick异步调用videoaudio的方法失效解决方案

    原文地址:https://qq282126990.github.io/2018/02/10/ nextTick JS的运行机制:JS执行是单线程的,它是基于事件循环的对于事件循环的理解大致分为以下几个 ...

  9. Vue中 Vue.prototype 详解及使用——作用:避免和已被定义的数据、方法、计算属性产生冲突

    Vue中 Vue.prototype 详解及使用--作用:避免和已被定义的数据.方法.计算属性产生冲突 **应用场景:**在很多组件里用到数据/实用工具,但是不想污染全局作用域.这种情况下,可以通过在 ...

最新文章

  1. java学习笔记_Java学习笔记——第1篇
  2. 写给开发向产品转型的同学的3句话
  3. c#快捷键(成为高手必备)
  4. R语言:文本(字符串)处理与正则表达式
  5. 解决Tomcat下源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示
  6. 应用系统集群解决方案
  7. 在Ubuntu上安装使用深度影音深度音乐
  8. 逐步淘汰,微软宣布多款产品将停止支持 IE11
  9. 力压今日头条成 App Store 榜第一,个税 App 惊爆 62 例木马病毒!
  10. springboot-属性提示
  11. 3500常用汉字书法体检测数据集
  12. 恋爱物语iapp源码导入就可以用
  13. 在Ubuntu系统中安装字体(以安装华文行楷和方正舒体为例)
  14. 小米电视相册在哪 android,小米电视官方详解“共享相册”功能
  15. 硬件模拟大师_用机器人做咖啡,“智咖大师”这样升级新零售
  16. OXY OPENCART 商城自适应主题模板 ABC-0020-01
  17. 学习挖掘机和程序员哪个好
  18. c语言课程设计成型代码,【图片】发几个C语言课程设计源代码(恭喜自己当上技术小吧主)【东华理工大学吧】_百度贴吧...
  19. 教你如何复制别人的QQ空间为自己用
  20. v4l2框架-开启视频流(stream on)

热门文章

  1. 自疫情暴发以来,99%的中国IT决策者认为数据变得更重要
  2. Go 远超 Python,机器学习人才极度稀缺,全球 16,655 位程序员告诉你这些真相!...
  3. 罗永浩回应“鲨鱼皮技术遭质疑”;消息称马蜂窝开启裁员;Dart 2.7 发布 | 极客头条...
  4. Web 开发中使用了 Vim 作为主编辑器之后......
  5. 今晚开讲 | 打卡公开课、冲击排行榜,还有福利领取
  6. 有大招儿?请收下这份关于数据与智能的晋级攻略!
  7. 小小的 Python 编程故事
  8. 春晚鬼畜 B 站日排行最高,赵本山:我的时代还没有结束!
  9. 从 C++98 到 C++17,元编程是如何演进的? | 技术头条
  10. 漫画:什么是外部排序?