https://vuejs.org/v2/guide/reactivity.html#Async-Update-Queue中,文档告诉我们,如果要在渲染完成后执行某些操作(例如,获取元素的新宽度和高度),则应在Vue.nextTick(callback)的回调中进行操作。但是有几次我发现它不起作用(我不知道其他人是否有时也发现它不起作用),因此必须诉诸setTimeout对其进行修复。

我怀疑nextTick如何确保渲染完全完成。我阅读了源代码,发现它可能使用Promise.thensetImmediatesetTimeout(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

10-08 00:33