nextTick使用场景:
其中涉及到的知识点有:
事件循环 http://www.ruanyifeng.com/blog/2014/10/event-loop.html
nexttick调用阶段:
是在同步环境下完成的,通过在所有的dom数据更新完成以后。
如果我们需要获取修改后的dom数据,在vue代码后直接获得是不可能获取到的。
举例:
<div id="example">{{message}}</div>
var vm = new Vue({
el: '#example',
data: {
message: '123'
}
})
vm.message = 'new message' // 更改数据
vm.$el.textContent === 'new message' // false
Vue.nextTick(function () {
vm.$el.textContent === 'new message' // true
})
导致这个现象的原因是:vue更新dom是异步的。官方解释如下:
可能你还没有注意到,Vue 在更新 DOM 时是异步执行的。只要侦听到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更。如果同一个 watcher 被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作是非常重要的。然后,在下一个的事件循环“tick”中,Vue 刷新队列并执行实际 (已去重的) 工作。Vue 在内部对异步队列尝试使用原生的
Promise.then
、MutationObserver
和setImmediate
,如果执行环境不支持,则会采用setTimeout(fn, 0)
代替。例如,当你设置
vm.someData = 'new value'
,该组件不会立即重新渲染。当刷新队列时,组件会在下一个事件循环“tick”中更新。多数情况我们不需要关心这个过程,但是如果你想基于更新后的 DOM 状态来做点什么,这就可能会有些棘手。虽然 Vue.js 通常鼓励开发人员使用“数据驱动”的方式思考,避免直接接触 DOM,但是有时我们必须要这么做。为了在数据变化之后等待 Vue 完成更新 DOM,可以在数据变化之后立即使用Vue.nextTick(callback)
。这样回调函数将在 DOM 更新完成后被调用。
因此,我们需要通过一个函数,来获得更新后的dom数据。
给nexttick设置回调函数,此时在回调函数内获取dom数据就是更新后的dom。
参考:https://www.cnblogs.com/hity-tt/p/6729118.html 通过一个实例来说明nexttick的调用时机。
其说明过程有些意思:https://segmentfault.com/a/1190000012861862