【Vue】 computedとmethodsの違い 【初心者向け】
本記事では、Vue
の基本であるcomputed
とmethods
の違いについて初心者の方向けに解説します。
computed
で表現できることは、methods
でも同じことができますが、どちらで実装すべきなのか、違いは何なのかについて初心者向けに分かりやすく解説します。
この記事を読むことによって、Vue
のcomputed
とmethods
の違いが分かり、使い分けができるようになります。
computedとmethodsの違い
結論からいうと、computedが使える場合はcomputedを優先して使うべきであるということです。
computedは依存関係によりキャッシュされる
computed
は参照先のプロパティの値が変わった時のみ、computed
で定義された内容が再計算される仕組みになっています。つまり、computed
の方が余計な処理を行わなくて済むため、computed
が使えるならcomputed
を優先して使った方がよいということになります。
実際のコードでcomputedとmethodsの再計算のタイミングを確認する
具体的な例をサンプルコードを見ながら解説していきます。
サンプルコードを以下のJSFiddleに記載しています。
https://jsfiddle.net/zo4Lr5ub/
▼HTML
<div id="app">
<h2>Todos:</h2>
<div class="block">
<div class="text">{{ computedCounter }}</div>
<div class="text">{{ methodsCounter() }}</div>
<button @click="count += 1">カウントアップ (+1)</button>
</div>
<ol>
<li v-for="todo in todos">
<label>
<input type="checkbox"
v-on:change="toggle(todo)"
v-bind:checked="todo.done">
<del v-if="todo.done">
{{ todo.text }}
</del>
<span v-else>
{{ todo.text }}
</span>
</label>
</li>
</ol>
</div>
▼JavaScript
new Vue({
el: "#app",
data: {
todos: [
{ text: "Learn JavaScript", done: false },
{ text: "Learn Vue", done: false },
{ text: "Play around in JSFiddle", done: true },
{ text: "Build something awesome", done: true }
],
count: 0,
},
computed: {
computedCounter() {
console.log('computedCounter called!');
return `computedCounter: ${this.count}`;
}
},
methods: {
methodsCounter() {
console.log('methodsCounter called!');
return `methodsCounter: ${this.count}`;
},
toggle(todo) {
todo.done = !todo.done
}
}
})
サンプルコードでは、「カウントアップ」ボタンをクリックする度に、Vue
のdata変数「count
」が+1
ずつカウントアップされます。
- 「
computedCounter
」というcomputed
で、「count
」変数を元に「computedCounter: 0
」というような表示がされます。 - 「
methodsCounter()
」というmethods
の実行で、「count
」変数を元に「methodsCounter: 0
」というような表示がされるようにしています。 - 「
Todos:
」の領域では、チェックボックスを変化させることによってToDoの表示が切り替わり、こちらでは「count
」変数は使っていなく、「count
」変数とは無関係の表示領域になっています。
なお、「computedCounter
」と「methodsCounter()
」の実行時に、console.log()
が出力されて実行されたかどうかがわかるようになっています。
例)"computedCounter called!"
や"methodsCounter called!"
と表示される。
methods処理では画面の再描画の度に処理が実行される
▼「カウントアップ」ボタンのクリック時
・「カウントアップ」ボタンのクリック時は、console.log()
出力を見るとわかりますが、computed(computedCounter)
とmethods(methodsCounter)
の両方が呼ばれているのが分かります。
this.count
変数が変化することにより、関連するcomputed
とmethods
の両方が実行されて表示が正常にリアクティブに反応しています。
▼「Todos」でチェックボックスを変化させた時
・「Todos」領域のチェックボックスを変化させると、methods(methodsCounter)
が再計算されていることが、console.log()
出力を見て分かります。つまり、「Todos」領域の処理では、this.count
変数を変化させていなく関係ないのにも関わらず、「methodsCounter()
」が実行されて再計算されているのが分かります。
computedを優先して使うようにすべき
これらのことから分かるように、computed
は参照先のプロパティの値が変わった時のみ再計算されるため、できる限りcomputed
を使う方がよいことがわかります。
ただcomputed
だとキャッシュによって正常にリアクティブに反応しないケースもあるため、computed
とmethods
はケースバイケースで使い分けする必要もあります。
まとめ
Vue
のcomputed
とmethods
の違いについて解説しました。
Vue
のcomputed
は参照先のプロパティの値が変わった時のみ、computed
で定義された内容が再計算されるような、優秀な仕組みになっているので、computed
を優先して使うようにするべきということです。methods
だと無駄に再計算される可能性があります。
ご参考になれば幸いです。
※当サイトでは一部のリンクについてアフィリエイトプログラムを利用して商品を紹介しています