實務上較少在 v-for
內自行處理 DOM node,若真的需要則要使用 ref
與 $nextTick()
。
Version
Vue 2.6.11
nextTick()
Price 使用 v-for
顯示,但 title 則由 ref
自行處理。
<template>
<div>
<button @click="onClick">Draw Table</button>
<table>
<tr v-for="(x, i) in books" :key="i">
<td ref="title"/>
<td>{{ x.price }}</td>
</tr>
</table>
</div>
</template>
<script>
let onClick = function() {
this.$nextTick().then(() => {
let text = document.createTextNode('hello')
this.$refs.title[0].appendChild(text)
})
}
export default {
data: () => ({
books: [
{ 'title': 'FP in JavaScript', price: 100 },
{ 'title': 'RxJS in Action', price: 200 },
{ 'title': 'Speaking JavaScript', price: 300 }
]
}),
methods: {
onClick
}
}
</script>
第 4 行
<table>
<tr v-for="(x, i) in books" :key="i">
<td ref="title"/>
<td>{{ x.price }}</td>
</tr>
</table>
使用 v-for
處理 <table>
,但注意有一個 <td>
並沒有被 v-for
接管,而自行使用 ref
處理。
14 行
let onClick = function() {
this.$nextTick().then(() => {
let text = document.createTextNode('hello')
this.$refs.title[0].appendChild(text)
})
}
<table>
因為 v-for
已經 render 過,若要單獨處理 <td>
,只能使用 ref
,且必須搭配 $nextTick()
。
因為 $nextTick()
回傳 Promise,所以須將 DOM API 寫在 then()
的 callback 內。
Conclusion
- 當在 render 後改變 data 需顯示,且又沒有 data binding 時,就會需要使用
$nextTick()