基礎からメモ: Vue.js CH4-p143 更新後のDOMにアクセスする
仮想DOMによるデータの更新は非同期に行われるため、更新後のDOMを操作するためにはDOMの更新を待ち受ける仕組みであるnextTick
を使用する。
グローバルメソッドVue.nextTick
または、インスタンスメソッドthis.$nextTick
にコールバック関数を定義して使用する。
this.$nextTick(function() { // コールバック関数でDOM更新後に行いたい処理 })
更新後のDOMの高さを取得
<div id="app"> <!-- nextTickで更新後のDOMにアクセスする --> <button v-on:click="list.push(list.length+1)">追加</button> <!-- ref="名前"で$refsから取得する要素に指定 --> <ul ref="list"> <li v-for="item in list">{{ item }}</li> </ul> </div>
var app = new Vue({ el: '#app', data: { list: [] }, watch: { list: function() { // 更新後の要素の高さを取得できない console.log('通常: ', this.$refs.list.offsetHeight); // nextTickを使えばできる this.$nextTick(function() { console.log('nextTick: ', this.$refs.list.offsetHeight); }) } } })
表示結果:
通常のは更新後の高さを取得できていないので「0」から始まるが、nextTick
を使った方は一回のクリックで追加された要素を含む高さを取得できている。
通常: 0 nextTick: 16 通常: 16 nextTick: 32 通常: 32 nextTick: 48 通常: 48 nextTick: 64 ....
nextTick
は画像やウェブフォントのロードは待たないので、DOM内にそれらを含む場合は画像等のロードを待つコールバック関数内で使う必要がある。