質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1646閲覧

Vueのhandlerとは

Nero1129

総合スコア130

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/10/22 11:14

公式ドキュメントを見ながら、Vueの勉強をしています。

簡単なWebアプリTodoリストを作成する公式ドキュメントの作例があり、真似ながらプログラムを書いています。
ToDoリスト例

この作例の中に出てくるhandlerの意味が分かりません。

JavaScript

1 watch: { 2 todos: { 3 handler: function() { 4 todoStorage.save(todos) 5 }, 6 deep: true 7 } 8 }

勝手な考察と試したこと

これは、handlerという名前にしているだけなのでしょうか?
それとも、何かしらのプロパティなどですか?
Vueのドキュメントにも書かれておらず、MDNで調べても全然出てきません。
解説、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ウォッチャがオブジェクト内の変更を感知した際に実行する処理を記載する場所がhandlerです。

例えば以下の①の場合のコードはhandlerが無くても動きますが、②のコードは動きません
そのため③のコードのようにdeep: truehandlerを用いて値の変更を監視します。
https://jsfiddle.net/svudfLoc/
https://jsfiddle.net/5gxa10cy/
https://jsfiddle.net/w0kv2b6x/

追記:
ご提示のToDoリスト例に関しても、ウォッチャが監視しているtodosはオブジェクトを値に持つ配列なので、handlerを消してしまうと正しく機能せずtodoStorage.saveが発火していないのが分かると思います。
試しにtodoStorageのsaveメソッドalert('fired')を追記し、どのタイミングで呼ばれているのか確認すると分かりやすいです。
例えば、リストの左にあるチェックボックス(.toggle)にチェックを入れると該当のtodos[index].completedtrueに変更するので、このタイミングでウォッチャが反応しますが、handlerを消してしまうと変更を感知できずtodoStorage.saveは発火しません。
またテキストボックス(.edit)からtodos[index].titleを編集する時も同じです。
変更後にリロードしてみると、ローカルストレージに保存できていないのが分かると思います。

恐らく__Nero1129さん__が「handlerを消しても動作する」と仰っているのは、addTodoを実行した時の事だと思いますが、この場合は配列にオブジェクトをpushしているだけなのでhandlerが無くてもウォッチャは変更を感知できます。
そのためtodoStorage.saveが発火しローカルストレージに保存できています。

まとめ:
handlerを消してしまうと、addTodoでの変更はローカルストレージに保存されるが、.edit.toggleでのプロパティの変更はウォッチャが感知できずにローカルストレージに保存されない。
そのため、一見すると問題無く動いているように見えるが、実際は期待された動作が正しく行われていない。

投稿2019/10/22 12:54

編集2019/10/22 21:41
take-t.t.

総合スコア360

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Nero1129

2019/10/22 13:14

回答ありがとうございます。 そうなんですね。ドキュメントには一切の記載がなかったので全然わかりませんでした。 `handler`を消しても動作するのですが、この場合、なぜ`handler`をつけているんでしょうか?
rubytomato

2019/10/22 14:05

> `handler`を消しても動作するのですが、 handlerを消した後のコードを具体的に教えてください
take-t.t.

2019/10/22 14:42

回答に追記しました。 リンク先のコードを実際動かしてもらえるとわかりやすいと思います。
take-t.t.

2019/10/22 19:20 編集

すいません、自分の理解が間違っていたかもしれません。 少し調べます。
tanishi_a

2019/10/22 14:57 編集

(間違いのためいったん削除)
take-t.t.

2019/10/22 19:15 編集

申し訳ありません、自分は配列の値の変更もdeepウォッチする必要があると思っていたのですが、実は必要なのはオブジェクトの変更のみのようでした。 それに合わせて回答を編集いたしました。 ご確認をお願いいたします。
Nero1129

2019/10/22 23:08

僕なんかのために懇切丁寧に解説していただき、ありがとうございます。 なるほど! 仰る通り、作例から試験的に保存する機能だけを抜き出して実行していたので、そちらは盲点でした。 大変勉強になりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問