【vue】 methods、computed、watchの違い
methods
、computed
、watch
の3つは、いずれも関数と同様に処理を書きます。
そこで、それぞれの違いを把握して、適切に使い分けられる様になる必要があります。
それぞれの書き方などについてはこちら
methods
中にロジックを書き、様々な処理をするのに向いています。
値の状態に関わらず、任意のタイミングで呼び出して使用できます。
const app = Vue.createApp({ data() { return { text: "", } }, methods: { reset() { this.text = ""; } } });
See the Pen by Totori (@souki202) on CodePen.
手動で呼び出して何かを処理させたい場合に使用します。
また、戻り値を普通のメソッドのように使うことができます。
const app = Vue.createApp({ methods: { m1() { return 100; }, m2() { // 600が代入される this.data = this.m1() + 500; } } });
普通にreturn文を書き、普通のメソッドのように使うことができます。
また、asyncにすることが来ます。
const app = Vue.createApp({ methods: { async m1() { return await axios.get(...); }, async m2() { const result = await m1(); // 色々処理 } } });
このように、普通のメソッドと同様に、async
とawait
を使えます。
そのため、methods
は、要は普通の処理をしたいときに使用するものです。普通にメソッドを呼び出し、普通に戻り値を取得を取得する場合に用います。
computed
その関数内で利用する値が変化すると自動的に再計算されます。計算された値は裏でキャッシュされており、DOMが再描画されるときにはそのキャッシュされている値が使用されます。
そのため、DOMで計算した値を表示するのに適しています。
const app = Vue.createApp({ data() { return { v1: 0, v2: 0, } }, computed: { sum() { // v1かv2が更新されると自動で再計算 return this.v1 + this.v2; } } });
また、vue内でもthis.sum
のように変数と同じ感覚で呼び出せます。
See the Pen vue1 compare1 by Totori (@souki202) on CodePen.
computed
はすぐに計算結果を出せる必要があるため、async
は利用できません。
上の例の場合、computed
なら自動的に再計算されますが、methods
だとボタンなどを用意したり、イベントを書いたりしなければなければならない上に、計算した値を入れる変数を用意しなければなりません。
watch
の場合、2つの変数を監視し、同じ処理をさせる必要があり非効率です。methods
と同様に計算した値を入れる変数も用意する必要もあるため、上のような例ではwatch
も向いていません。
watch
特定の変数やオブジェクトを監視し、変化があればロジックが走ります。
ロジックを走らせるという点ではmethods
と同じですが、こちらは変数の変化があったときに自動で実行されるので、任意のタイミングで実行するわけではありません。
また、特定の値が変わったときに実行されるという点ではcomputed
と同じですが、こちらでは戻り値が無視されます。つまり、内部のdata
の値を書き換えたいと言う時に使用します。
つまり、特定の値が変わったら何かしらの処理したい、かつ内部の値を書き換えたり、送信などの処理をしたい、というときに適しています。また、裏で非同期でデータを取得するなど、aysncも利用できます。
const app = Vue.createApp({ data() { return { v: 0, msg: "", foo: { bar: [10, 20, 30], }, } }, watch: { // this.v が更新されると自動で実行 v() { this.msg = ""; setTimeout(() => { this.msg = "送信完了"; }, 1000); }, // オブジェクトの中の特定の値の場合 "foo.bar.1": { handler: function() { // ... } }, "foo.bar": { handler: function() { // ... }, deep: true, // オブジェクトの中全体を監視対象とする場合 } } });
See the Pen vue1 compare2 by Totori (@souki202) on CodePen.
methods, computed, watchの違いのまとめ
3つの機能の違いを見てみましょう。
method | computed | watch | |
---|---|---|---|
呼び出し | 任意のタイミング | 中で使用している変数が更新された時 | 指定した変数が更新された時 |
return文 | 使える (普通の関数と同じ) | ほぼ必須 (結果は変数のように使う+キャッシュ付き) | 無意味 |
async指定 | できる | できない | できる |
一番の大きな差は、自動で呼び出されるかどうかです。もし任意のタイミングで呼び出したいのなら、method
意外に選択肢はありません。
値が更新されたときに自動で呼び出したい場合、computed
かwatch
の2択です。その中で、計算結果を使うのが主ならcomputed
を、ロジックを走らせることが主ならwatch
を選ぶと良いです。
まとめ
methods
はおそらく最もよく使うもので、要は普通のメソッドです。最初の慣れないうちはこれ1つでも作れますが、より最適化して、読みやすいプログラムとなるとcomputed
とwatch
の違いを知る必要があります。
3つの違いを把握して使いこなせるようになりましょう!
