vue.js - vue.js:nextTick如何保证数据变化后dom渲染完成?
问题描述
在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 结构。
您可以使用类似this.$refs.p.innerHTML
nextTick 回调中的内容访问更新的 DOM。但是您可能还没有在屏幕上看到该内容。
nextTick
将您的回调放入微任务队列中,在所有微任务完成后,浏览器将有机会呈现新内容。
如果要等待内容显示在屏幕上,可以使用setImmediate
(仅限 IE)或setTimeout(fn, 0)
优先级低于渲染任务的任务,以便在显示新内容后执行。
例如小提琴见这个答案:
https ://forum.vuejs.org/t/does-nexttick-work-weirdly/42918/7
推荐阅读
- python - 如何在 python 中遍历 JSON 列表并插入 PostgreSQL?
- c# - 如何在 C# 中收集具有泛型类型的静态类的所有“实例”?
- c# - 如何在 MVC 视图中使用 DISTINCT?
- python-3.x - Multiprocessing.apply 在 Python 3 上
- java - 在 GSTR7 中使用填充密码解密时,输入长度必须是 16 的倍数
- react-native - 如何在列布局中水平弯曲?目前只有屏幕宽度的一半
- laravel - SQLSTATE [42S02]:未找到基表或视图:1932 引擎中不存在表“blog.categories”(SQL:从“类别”中选择 *)
- python-3.x - 如何融化多级数据框
- php - 我想将 for 循环中的值放入一个变量中
- python - sorting a query set after a for loop on it