クマのブログ

つまづいたところ、学びを書いていきます

computed, watch, methodsの違い

https://qiita.com/yukibe/items/f49fcb935363200916fe

computed


  • 算出プロパティ
    • 以下のような可読性の悪いテンプレート内のコードをすっきりさせる

↓before

<div id="example">
  {{ message.split('').reverse().join('') }}
</div>

↓after

<div id="example">
  <p>Original message: "{{ message }}"</p>
  <p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>

...

<script>
export default {
    computed: {
        // 算出 getter 関数
        reversedMessage: function () {
          // `this` は vm インスタンスを指します
          return this.message.split('').reverse().join('')
        }
     }
}
</script>
  • リアクティブな依存関係にもとづきキャッシュされる
    • data()内のデータが変わってもキャッシュされた値を取得してくるので、再描画されない
    • 参考記事の例を見るとわかりやすい
      • dataに定義されているfirstNamelastNameが変更されるたびに、コンポーネント内のテンプレートは再描画されるが、nowは初回読み込み時の値をキャッシュしたモノを取得してくるので、変更されない

methods


  • computedの逆で、リアクティブな依存関係にもとづきキャッシュされないのがmethods
  • これまた参考記事の例を見るとわかりやすい
    • computedとの比較で今回はfirstNamelastNameが変更されるたびに、nowは再描画され、現在時刻を返す(=表示する)
  • 一般的には「メソッド呼び出しは、再描画が起きると常に関数を実行する」と言われる

watch


  • 再描画時に特定のdataプロパティに対して、computedでは書けない複雑な処理を書こうとした時に使用
  • 通常、「dataの監視」という目的であれば冗長性を避けるためにcomputedを使われる

https://jp.vuejs.org/v2/guide/computed.html#算出プロパティ-vs-監視プロパティ

まとめ


どれを使えばいいか迷った際には1→2の流れで進める。


1, dataの内容が変更された際に常に再描画をしてほしいか

  • Yes(常に更新)→methods
  • No(初回アクセス時の値をキープ)→computed、watch
    • 但し、冗長化を避けるためにcomputed推奨
  • computedで実現できない(複雑な処理を書く)場合はwatch