在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渲染已完成)。
有人可以给我一个解释吗?谢谢。
答案 0 :(得分:1)
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