vue.js:nextTick如何在数据更改后确保dom渲染完成?

时间:2018-07-12 03:41:13

标签: vue.js vuejs2

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

我怀疑nextTick如何确保渲染完全完成。我阅读了源代码,发现它可能使用Promise.thensetImmediatesetTimeout(cb, 0)nextTick处运行代码。我认为dom渲染可以在事件循环的滴答声之间的任何时间发生。因此,nextTick使用的所有内部方法都不能确保完成新的渲染工作。

[注意]我不是在讨论调用nextTick来解决的好方法 有些问题,这是另一个问题。我的意思是为什么它可以执行所提供的操作(dom渲染已完成)。

有人可以给我一个解释吗?谢谢。

1 个答案:

答案 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