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に定義されている
firstName
とlastName
が変更されるたびに、コンポーネント内のテンプレートは再描画されるが、now
は初回読み込み時の値をキャッシュしたモノを取得してくるので、変更されない
- dataに定義されている
methods
- computedの逆で、リアクティブな依存関係にもとづきキャッシュされないのがmethods
- これまた参考記事の例を見るとわかりやすい
- computedとの比較で今回は
firstName
とlastName
が変更されるたびに、now
は再描画され、現在時刻を返す(=表示する)
- computedとの比較で今回は
- 一般的には「メソッド呼び出しは、再描画が起きると常に関数を実行する」と言われる
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