原文章地址: https://www.jianshu.com/p/a7550c0e164f
作者:Ruheng
来源:简书
1 为什么用vue nextTick()???
vue更新数据是异步的,在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。
所以就衍生出了这个获取更新后的DOM的Vue方法。所以放在Vue.nextTick()回调函数中的执行的应该是会对DOM进行操作的 js代码
2 一般应用在哪些地方???
2-1 Vue生命周期的created()钩子函数进行的DOM操作
原因:DOM操作是异步的,在created()钩子函数中,数据的改变还不会使DOM更新,因为在mounted之前的钩子函数,还没真正挂载到DOM上,此时操作DOM就得vue nextTick(()=>{ //操作DOM代码 });mounted钩子函数中,el挂载,但DOM并未完全渲染或正在渲染,如需在渲染完之后操作DOM,就放在nextTick()回调函数中去执行DOM操作
2-2 在数据变化后要执行的某个操作,而这个操作需要使用随数据改变而改变的DOM结构
原因:Vue 异步执行 DOM 更新。只要观察到数据变化,Vue 将开启一个队列,并缓冲在
同一事件循环中发生的所有数据改变。如果同一个 watcher 被多次触发,只会被推
入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作
上非常重要。然后,在下一个的事件循环“tick”中,Vue 刷新队列并执行实际 (已去
重的) 工作。Vue 在内部尝试对异步队列使用原生的 Promise.then 和
MessageChannel,如果执行环境不支持,会采用 setTimeout(fn, 0)代替。
例如,当你设置vm.someData = 'new value',该组件不会立即重新渲染。当刷新
队列时,组件会在事件循环队列清空时的下一个“tick”更新。多数情况我们不需要
关心这个过程,但是如果你想在 DOM 状态更新后做点什么,这就可能会有些棘
手。虽然 Vue.js 通常鼓励开发人员沿着“数据驱动”的方式思考,避免直接接触
DOM,但是有时我们确实要这么做。为了在数据变化之后等待 Vue 完成更新
DOM ,可以在数据变化之后立即使用Vue.nextTick(callback) 。这样回调函数在
DOM 更新完成后就会调用。
网友评论