提示:前端查漏补缺,仅代表个人观点,不接受任何批评
文章目录
- 一、nextTick是什么?
- 二、使用步骤
- 三、使用场景
- 1.初始化绑定或操作 DOM
- 2.获取元素宽度
- 总结
提示:vue是异步执行DOM更新的。
vue实现响应式并不是数据发生改变之后DOM立即变化,而是按一定的策略进行DOM更新
一、nextTick是什么?
- Vue 在监听到数据变化后会重新渲染,配合 VDOM 更新真实的 DOM,而
nextTick
的触发时机就是在调用方法后的第一次重新渲染完毕后. - nextTick将回调延迟到下次 DOM 更新循环之后执行。在修改数据之后立即使用它,然后等待
DOM
更新。
在vue中,并不是数据一更新,DOM就立即更新,页面立即渲染,而是当一个事件循环结束后,DOM才会完成更新,页面才会成功渲染;
如通过一个for循环改变一个数据,即使这个for循环100次,DOM也只会在第100次时才更新,而不是循环100次,DOM就更新100次。
二、使用步骤
代码如下(示例):
//在该示例中,控制台会抛出一个innerHTML of null的错误,
//这是由于此时页面并未完成渲染,它并没有获取到这个div元素。
<div id=app>
<div id="div" v-if="showDiv">我是显示文本</div>
<button @click="showAndGetText">获取内容</button >
</div>
<script>
var app = new Vue({
el: '#app',
data () {
return {
showDiv : false
},
methods: {
showAndGetText () {
this.showDiv = true
let text = document.getElementById('div').innerHTML
console.log(text)
}
}
}
})
</script>
我们利用nextTick改造下这个method
通过
this.$nextTick()
调用的代码直接进入下一个tick,相对于下一个tick,当前tick中的DOM已完成更新。
代码如下(示例):
showAndGetText () {
this.showDiv = true
this.$nextTick(()=>{
let text = document.getElementById('div').innerHTML
console.log(text)
})
}
//更改之后成功显示出这个div元素的文本信息
三、使用场景
常用于需要等待渲染完成后执行的一些方法
1.初始化绑定或操作 DOM
- 比如在 created 和 mounted 回调中,需要操作渲染好的 DOM,则需要在 nextTick 中执行相关逻辑。
2.获取元素宽度
- 在 Vue 中获取元素宽度有两种方式,第一种是通过
$refs[ref名称].
,第二种可以使用传统操作 DOM 的方式获取,但这两者要获取到准确的元素宽度,则需要在 DOM 渲染完毕后执行。
代码如下(示例):
<template>
<p ref="myWidth" v-if="showMe">{{ message }}</p> <button @click="getMyWidth">获取p元素宽度</button>
</template>
<script>
export default {
data() {
return {
message: "Hello world!",
showMe: false,
},
methods: {
getMyWidth() {
this.showMe = true;
// = ; //报错 TypeError: is undefined
this.nextTick(()=>{
//dom元素更新后执行,此时能拿到p元素的属性
// = ; })
}
}
}
}
</script>
总结
Vue 的设计理念并不建议我们去直接操作 DOM,但有些场景下出现了特别令人迷惑的问题,理解 Vue 的渲染逻辑后,使用
nextTick()
可以解决。