0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Vue】watchでデータの監視

Last updated at Posted at 2022-07-06

はじめに

「watch」とは、特定のデータまたは算出プロパティの状態を監視して、変化があったら処理を自動的に実行する。
データの変化をがトリガーになる。

使い方

大きく分けて2種類の書き方がある。

1.watchオプションに定義

1つ目はコンポーネントのwatchオプションに、監視したいデータの名前変化した時に呼び出されるハンドラを定義する方法
第1引数として「新しい値」、第2引数として「古い値」を受け取ることができる。

sample.js
new Vue({
  watch: {
    監視するデータ: function(新しい値, 古い値) {
      // データが変化した時に行いたい処理
    },
    // オブジェクトのプロパティも監視できる
    'item.value': function(新しい値, 古い値) {
      // 処理
    }
  }
})

オプション

watchの定義ではオプションを任意で設定できる。それぞれ設定値はBoolean
deep: ネストされたオブジェクトも監視する
immediate:初期表示時にも呼び出す

オプションを使用する場合は、handlerプロパティにハンドラを定義。
handlerはオプションを使用するときに必要になるオブジェクトのこと

sample.js
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に格納されているオブジェクトのプロパティが更新されても処理が実行されない。

sample.js
this.list[0].age = 11;

trueにすることでこのような配列要素内のプロパティ(入れ子やネストしたプロパティ)更新時にも呼び出される。

2.メソッドに定義

もう1つの方法は、各メソッド内でウォッチャを登録する方法。
インスタンスメソッドthis.$watchを使用。以下のように引数を渡す。

script.js
this.$watch('監視したいデータ',ハンドラ関数,オプション)
sample.js
// ライフサイクルのcreatedにwatchを登録
created() {
  this.$watch('value', function(newVal, oldVal) {
    // 処理
  }, {
    deep: true,
    immediate: true
  })
}

監視の解除

インスタンスメソッドで登録した場合、返り値を使用して監視を解除できる。

script.js
var unwatch = this.$watch('value', handler)
unwatch()

一度だけ監視

一度監視して、監視を解除することもできる。

script.js
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
    })
  }
})

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?