在https://vuejs.org/v2/guide/reactivity.html#Async-Update-Queue中,文档告诉我们,如果要在渲染完成后执行某些操作(例如,获取元素的新宽度和高度),则应在Vue.nextTick(callback)
的回调中进行操作。但是有几次我发现它不起作用(我不知道其他人是否有时也发现它不起作用),因此必须诉诸setTimeout
对其进行修复。
我怀疑nextTick
如何确保渲染完全完成。我阅读了源代码,发现它可能使用Promise.then
,setImmediate
或setTimeout(cb, 0)
在nextTick
上运行您的代码。我认为dom渲染可以在事件循环的各个滴答之间随时发生。因此,nextTick
使用的所有内部方法都不能确保完成新的渲染工作。
[注意]我不是在讨论调用nextTick
解析的好方法
有些问题,这是另一个问题。我的观点是为什么它可以执行其提供的功能(dom渲染已完成)。
有人可以给我一个解释吗?谢谢。
最佳答案
nextTick
不保证DOM渲染完成,而只是保证DOM结构已更新。
您可以在nextTick的回调中使用this.$refs.p.innerHTML
之类的内容访问更新的DOM。
但是您可能尚未在屏幕上看到该内容。nextTick
将您的回调放入微任务队列中,在完成所有微任务后,浏览器将有机会呈现新内容。
如果要等待内容在屏幕上显示,则可以使用setImmediate
(仅限IE)或setTimeout(fn, 0)
(其优先级低于渲染任务),以便在显示新内容后执行。
请参见以下答案,例如小提琴:
https://forum.vuejs.org/t/does-nexttick-work-weirdly/42918/7