今天遇到了这样一个场景,在数据更新之后,使用this.$nextTick(()=>{console.log(this.$refs.xxx)}) 获取不到改dom,但是用setTimeout能够获取到,在此记录一下。
先看代码
<!--这是模板代码,父级用的v-else-if,与父级同级的还有两个盒子,分别用v-if和v-else控制着-->
<div ref="articleContent" class="right" v-html="articles.content"></div>
//这是script代码
mounted() {
this.getArticlesDetail()
},
methods: {
async getArticlesDetail(){
try {
const {data}= await getArticlesDetail(this.articleId);
/* vue数据更新是异步的 ,在这一步数据加载出来,但是组件还没没有渲染出来,因为在组件中有个v-if判断,在数据加载出来之后,才能渲染出来组件*/
/* console.log(this.$refs.articleContent) */
/* 所以要放在定时器是异步执行,试了用this.$nextTick,不行 */
/* */
this.articles = data
/* 只能用setitmeout是因为数据在在下个Event Loop中也出不来,这是因为v-if中的条件在下次事件循环中也不一定能够满足。但是setTimeout的执行时机是没有办法确定前边的任务到底需要多长时间执行完 */
this.$nextTick(() => {
console.log(this.$refs.articleContent)
});
console.log(data)
} catch (error) {
if(error.response && error.response.status===404){
this.errStatus=404;
this.$toast('服务器错误')
}
console.log(error)
this.$toast('请求失败,请稍后再试')
}
/* 无论成功失败都要调用loading为false,关闭它 */
this.loading=false
}
},
这是控制台打印的效果.

获取不到.
vue官网中对于vue.nextTick()中的解释:

也就是说在下个事件循环中没有满足v-if中的条件,所以没有获取到数据。
在vue 中的devtools中 可以获取到。

然后我们修改成setTimeout
<!--这是模板代码,父级用的v-else-if,与父级同级的还有两个盒子,分别用v-if和v-else控制着-->
<div ref="articleContent" class="right" v-html="articles.content"></div>
//这是script代码
mounted() {
this.getArticlesDetail()
},
methods: {
async getArticlesDetail(){
try {
const {data}= await getArticlesDetail(this.articleId);
/* vue数据更新是异步的 ,在这一步数据加载出来,但是组件还没没有渲染出来,因为在组件中有个v-if判断,在数据加载出来之后,才能渲染出来组件*/
/* console.log(this.$refs.articleContent) */
/* 所以要放在定时器是异步执行,试了用this.$nextTick,不行 */
/* */
this.articles = data
/* 只能用setitmeout是因为数据在在下个Event Loop中也出不来,这是因为v-if中的条件在下次事件循环中也不一定能够满足。但是setTimeout的执行时机是没有办法确定前边的任务到底需要多长时间执行完 */
setTimeout(() => {
console.log(this.$refs.articleContent)
});
console.log(data)
} catch (error) {
if(error.response && error.response.status===404){
this.errStatus=404;
this.$toast('服务器错误')
}
console.log(error)
this.$toast('请求失败,请稍后再试')
}
/* 无论成功失败都要调用loading为false,关闭它 */
this.loading=false
}
},
这是控制台打印的效果

可以看出来有效果.

在vue中的devtools中也有,
这是为什么呢?
只能用setitmeout是因为数据在在下个Event Loop中也出不来,这是因为v-if中的条件在下次事件循环中也不一定能够满足。但是setTimeout的执行时机是没有办法确定前边的任务到底需要多长时间执行完,所以使用setTimeout会更好。
在Vue开发中遇到问题,this.$nextTick()方法无法在数据更新后立即获取到$refs,而setTimeout能成功。官方文档解释是因为在下个事件循环中v-if条件未满足。在Vue DevTools中可以看到$refs,但实际使用this.$nextTick()时仍无法获取。使用setTimeout由于执行时机不确定,有时能确保在数据变化后执行,因此在某些情况下更可靠。
2543

被折叠的 条评论
为什么被折叠?



