Vue.nextTick([callback, context])
参数
-
{Function} [callback]:回调函数,不传时提供promise调用
-
{Object} [context]:回调函数执行的上下文环境,不传默认是自动绑定到调用它的实例上。
用法
–
在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。
简单的理解是:当数据更新了,在 DOM 中渲染后,自动执行该函数。
举个栗子:
<button id=“firstBtn”
@click=“testClick()”
ref=“firstBtn”>
{{ testMsg }}
复制代码
点击按钮,打印出来的结果为:
直接获取: 未更新
啥也不干,就是玩。
nextTick回调: 最后更新
nextTick作为Promise: 最后更新
复制代码
从以上例子可以发现:
-
我们多次更改了testMsg的值,但最终只能拿到
this.testMsg = '最后更新'
; -
在更改之后直接获取DOM数据的时候,因为此时DOM还没有更新,所以只能拿到更新前的DOM数据
未更新
-
无论是在
nextTick
回调函数还是then函数中的方法,都会在当前方法内所有同步代码执行完毕之后再执行,然后就能拿到更新后的DOM数据了
这是什么原因呢?
原理
JS运行机制(Event Loop)
JS事件循环(Event Loop)
JS执行是单线程的,它是基于事件循环的。
-
所有同步任务都在主线程上执行,形成一个执行栈。
-
主线程之外,会存在一个任务队列,只要异步任务有了结果,就在任务队列中放置一个事件。
-
当执行栈中的所有同步任务执行完后,就会读取任务队列。那些对应的异步任务,会结束等待状态,进入执行栈。
-
主线程不断重复第三步。
这里主线程的执行过程就是一个tick,而所有的异步结果都是通过任务队列来调度。Event Loop 分为宏任务和微任务,无论是执行宏任务还是微任务,完成后都会进入到一下tick,并在两个tick之间进行UI渲染。
Vue更新策略
同样,Vue 是异步执行 DOM 更新的。更新过程如下:
-
一旦观察到数据变化,Vue 就会开启一个队列,然后把在同一个事件循环 (event loop) 当中观察到数据变化的 watcher 推送进这个队列。
-
如果这个 watcher 被触发多次,只会被推送到队列一次。这种缓冲行为可以有效的去掉重复数据造成的不必要的计算和 DOM 操作。
-
而在下一个事件循环时,Vue 会清空队列,并进行必要的 DOM 更新。
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!