はじめに
「watch」とは、特定のデータまたは算出プロパティの状態を監視して、変化があったら処理を自動的に実行する。
データの変化をがトリガーになる。
使い方
大きく分けて2種類の書き方がある。
1.watchオプションに定義
1つ目はコンポーネントのwatchオプションに、監視したいデータの名前
と変化した時に呼び出されるハンドラ
を定義する方法
第1引数として「新しい値」、第2引数として「古い値」を受け取ることができる。
new Vue({
watch: {
監視するデータ: function(新しい値, 古い値) {
// データが変化した時に行いたい処理
},
// オブジェクトのプロパティも監視できる
'item.value': function(新しい値, 古い値) {
// 処理
}
}
})
オプション
watchの定義ではオプションを任意で設定できる。それぞれ設定値はBoolean
deep
: ネストされたオブジェクトも監視する
immediate
:初期表示時にも呼び出す
オプションを使用する場合は、handlerプロパティにハンドラを定義。
handlerはオプションを使用するときに必要になるオブジェクトのこと
new Vue({
el: 'app',
data: {
list: [
{ name: '太郎', age: 10 },
{ name: '花子', age: 12 }
]
},
watch: {
list: {
handler: function(newVal, oldVal) {
// listが変化した時に行いたい処理
},
deep : true,
immediate: true
}
}
});
watchはデフォルトの状態では、指定したプロパティの値しか監視しない。
つまりdeepがfalseだとlistに格納されているオブジェクトのプロパティが更新されても処理が実行されない。
this.list[0].age = 11;
trueにすることでこのような配列要素内のプロパティ(入れ子やネストしたプロパティ)更新時にも呼び出される。
2.メソッドに定義
もう1つの方法は、各メソッド内でウォッチャを登録する方法。
インスタンスメソッドthis.$watch
を使用。以下のように引数を渡す。
this.$watch('監視したいデータ',ハンドラ(関数),オプション)
// ライフサイクルのcreatedにwatchを登録
created() {
this.$watch('value', function(newVal, oldVal) {
// 処理
}, {
deep: true,
immediate: true
})
}
監視の解除
インスタンスメソッドで登録した場合、返り値を使用して監視を解除できる。
var unwatch = this.$watch('value', handler)
unwatch()
一度だけ監視
一度監視して、監視を解除することもできる。
new Vue({
el: 'app',
data: {
edited: false,
list: [
{ name: '鉛筆', price: 98 },
{ name: '消しゴム', price: 100 }
]
},
created() {
var unwatch = this.$watch('list', function() {
// データlistが変更されたらeditedをtrueにし、
this.edited = true
// データが変更されたら監視を解除
unwatch()
}, {
deep: true
})
}
})
参考