当我在带有数据成员isLoading: false
和模板的.vue文件中具有Vue组件时:
<div v-show="isLoading" id="hey" ref="hey">Loading...</div>
<button @click="loadIt()">Load it</button>
和方法:
loadIt() {
this.isLoading = true
this.$nextTick(() => {
console.log(this.$refs.hey) // virtual DOM
console.log(document.getElementById('hey')) // actual DOM
// ...other work here
})
}
我认为nextTick函数将允许虚拟DOM和实际DOM都进行更新,因此两条console.log行将输出相同的结果。但是,它们没有这样做:似乎真实的DOM并没有立即更新,因此第二个日志生成带有的元素,display: none;
而第一个日志却没有-我在控制台上得到了:
<div id="hey" data-v-964d645e="" style="">
<div id="hey" data-v-964d645e="" style="display: none;">
(顺便说一句,即使我使用setTimeout
而不是this.$nextTick
,我也从console.log获得了相同的结果。我也尝试使用该updated
钩子,但是同样的症状在那里发生。消失,但在.vue文件中时仍然存在。)
Vue如何从虚拟DOM更新实际DOM是否有某种优化或进一步的异步性?我如何立即获取实际的DOM?
事实证明,eslint-loader高速缓存或babel-loader高速缓存存在问题导致了这种怪异。我只能通过删除全部来修复它node_modules\.cache
。太糟糕了,我不知道为什么会首先发生。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句