vue – $nextTick
Vue中, 有一個方法叫 $nextTick,它主要的作用是 當data資料更新後,立刻馬上拿到DOM的元素結果。
舉個例子:有一個列表,當點擊增加項目按鈕後,data 中 list 就會增加3筆數據。
<template>
<div class="main">
<ul ref="myUl">
<li v-for="(item,index) in list" :key="index">
{{item}}
</li>
</ul>
<button @click="addItem">增加項目</button>
</div>
</template>
<script>
export default {
data(){
return{
list:["香蕉","草莓","紅毛丹"]
}
},
methods:{
addItem(){
this.list.push(`${Date.now()}`);
this.list.push(`${Date.now()}`);
this.list.push(`${Date.now()}`);
const ulDom = this.$refs.myUl;
console.log("ul中有幾個li呢?====>",ulDom.childNodes.length)
}
}
}
畫面渲染完,會漲這樣子。
當我按下增加項目按鈕後,會發現畫面上有6筆資料,但是!!但是!!console.log( ) 出來,卻顯示抓到的DOM 元素只有3筆,3筆不是上一次的筆數嗎??那我再按一次…
又增加3筆,但console.log( ) 出來卻是6,但明明就是9筆壓!!
以上結果為什會是這樣呢??
原因是 vue 是異步渲染組件,當 data 數據改變後,並非馬上進行 DOM 的渲染。雖然,畫面看到9筆資料,但是實上,它console.log( ) 早就執行了,所以此時你拿到的真實的 DOM 都還是上次的,自然只會打印出6筆資料。
可是我們想要,所見即所得阿,我看到幾筆,console.log( ) 就應該打印幾筆阿!
這時候 $nextTick 出場啦!! 把程式碼改成這樣
this.$nextTick(()=>{
const ulDom = this.$refs.myUl;
console.log("ul中有幾個li呢?====>",ulDom.childNodes.length)
})
$nextTick 會在DOM 渲染完後,被觸發,這樣就可以馬上獲取DOM最新節點了。