2018.04.03

{{ Vue tips }} watchのimmediateオプション


Vue.jsの小ネタです。

これはこんな風にも書けるよ、というお話です 😃

Routerを含んだSPAを開発する際、以下のような記述をすることがあると思います。

Vueコンポーネント
created () {
  this.fetchData()
},
watch: {
  $route () {
    this.fetchData()
  }
}

fetchData はページごとに必要なデータを取得する(そしておそらく data のプロパティに代入する)メソッドだと思ってください。コンポーネントが初期化される時にデータを取得したいので createdfetchData を呼び出します。さらに、$route の値を watch して変更があったタイミングでも fetchData を呼び出さなくてはなりません。

というのも、例えば /posts/123 から /posts/987 に遷移したとき、つまり遷移先も同じコンポーネントである場合は、Vueの内部ではインスタンスをなるべく使いまわそうとするので created が呼ばれないのです。$route の値を watch しないと、URLは変わっているのにデータが変わらない状態になってしまうのですね。

さて、上記のコードは以下のように書き換えられます。

Vueコンポーネント
watch: {
  $route: {
    handler: 'fetchData',
    immediate: true
  }
}

ちょっとスッキリしました 😎

watch の値はオブジェクトを取ることもできます。その場合、handler に関数を指定するのですが、関数の指定は関数名(文字列)でも構いません。そして immediatetrue にすると、handler に指定した関数がすぐに実行されます。つまり created で呼び出すのと同じことになるわけです。

📔 マニュアル
https://jp.vuejs.org/v2/api/index.html#vm-watch

以上です。