$nextTick在Vue中的作用我们先看看文档是怎么说的:Vue在更新DOM的时候是异步执行的。只要检测到数据变化,Vue就会打开一个队列,缓冲所有发生在同一个事件循环中的数据变化。如果同一个观察者被多次触发,它只会被推入队列一次。这种缓冲时的重复数据删除对于避免不必要的计算和DOM操作非常重要。然后,在下一个事件循环“tick”中,Vue刷新队列并执行实际(去重)工作。Vue内部尝试使用原生的Promise.then、MutationObserver和setImmediate来实现异步队列。如果执行环境不支持,它将使用setTimeout(fn,0)代替。例如,当您设置vm.someData='newvalue'时,组件不会立即重新渲染。刷新队列时,组件会在下一个事件循环“tick”时更新。大多数时候我们不需要关心这个过程,但是如果你想根据更新的DOM状态做一些事情,它可能会很棘手。虽然Vue.js通常鼓励开发人员使用“数据驱动”的思维方式并避免直接接触DOM,但有时我们不得不这样做。要等待Vue在数据更改后完成更新DOM,请在数据更改后立即使用Vue.nextTick(callback)。这样回调函数就会在DOM更新完成后被调用。其实刚接触Vue的时候,看到这个文档的介绍,说实话还是有点懵(技术员水平不行)。所以本着在实战中提高的原则,尽量写个小demo来理解和巩固这个东西。PracticeDemo是一段很简单的代码,每次点击按钮,在列表中插入两个时间戳,渲染到li,在控制台输出li的个数。关键是直接输出会不会和$nextTick里面的输出不一样。最终效果是一个“神奇”的场景,直接在函数中console.log的结果似乎是“不正确”,而$nex??tTick中的结果似乎是正确的。两次输出结果不同的原因如文档中所述。Vue中DOM的更新是异步进行的,因为为了最小化性能开销,一个事件中所有的数据变化都不会同步更新DOM,而是等到事件结束再比较数据计算差值,并且然后立即更改DOM。所以,两个console.log的结果不一样就很好理解了。因为两个console.log的时间点不同,所以事件中的console.log是同步执行的。在列表数据中插入两条数据后,打印出来了,但是这时候事件还没有结束。DOM还没有变化,所以打印出来的结果还是原来的li数。$nextTick中的代码被异步调用并延迟。DOM变化完成后,调用这部分代码。
