LoginSignup
5
7

More than 3 years have passed since last update.

NuxtでWatchを使う時にアロー関数を使ってはならない

Posted at

結論

表題の通り。
Nuxtでカスタムウォッチャを使う時はアロー関数で書いてはならない。
アロー関数で書くと、thisがundefinedになってしまい、コンポーネントの要素へ全くアクセスできなくなってしまう。

カスタムウォッチャって?

Vueが用意してくれているプロパティを監視して、変更があれば任意の処理を実行してくれる仕組み
カスタムウォッチャ

コード例

わるい例

bad.vue
<script>
export default {
  components: {
  },
  data() {
    return {
      value
    }
  },
  watch: {
    value: newValue => {
      console.log('newValue:', newValue)
      console.log('this:', this) //=> undefinedになる
      this.hoge() //=> VueComponentにアクセスできないのでエラー
    }
  },
  methods: {
    hoge() {
      console.log('hoge')
    }
  }
}
</script>

よい例

good.vue
<script>
export default {
  components: {
  },
  data() {
    return {
      value
    }
  },
  watch: {
    value: function(newValue) {
      console.log('newValue:', newValue)
      console.log('this:', this) //=> VueComponent{...}
      this.hoge() //=> 正しくログがでる
    }
  },
  methods: {
    hoge() {
      console.log('hoge')
    }
  }
}
</script>

教訓

watchに関わらず、アロー関数のthisはその関数を呼び出した時に決定されるらしい。
ちゃんとドキュメントを読みましょうってことでした。
この記事に詳しく書かれています
Vue.jsに書いてある「アロー関数は、this が期待する Vue インスタンスではなく・・・」とは?

こちらの記事のコメント欄も参考になりました
Vue.jsでアロー関数を使うと詰む

5
7
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
5
7