たしかに「両方動く」かもしれませんが、挙動が異なります。
公式のサンプル
アプリの起動(new Vue({...}))から以下の動作になります。
nameの初期値に空文字列''がセットされる
- コンポーネントがマウントされ、
mounted()が呼ばれる
localStorageにnameがあれば、それをthis.nameに代入する
- (3)で
this.nameが変更された場合、監視用の関数name()が呼ばれる
localStorage.nameにnewNameが保存される
その後、ユーザーの操作で以下の動作になります。
- ユーザーがテキストフィールドで名前を入力する(変更する)
v-model="name"により、コンポーネントのデータnameが更新される
- 監視用の関数
name()が呼ばれる
localStorage.nameにnewNameが保存される
ma7ma7pipipiさんのコード
アプリの起動(new Vue({...}))から以下の動作になります。
nameの初期値に空文字列''がセットされる
その後、ユーザーの操作で以下の動作になります。
- ユーザーがテキストフィールドで名前を入力する(変更する)
v-model="name"により、コンポーネントのデータnameが更新される
- 監視用の関数
name()が呼ばれる
localStorage.nameにnewNameが保存される
- コンポーネントのデータ
nameにnewNameが保存される
両者の違いは「コンポーネントをマウントした時、localStorageの値をnameに代入し、フォームに表示しているか」です。
公式のサンプルでは、mounted()が呼ばれた際には(5)の挙動が1回目は無駄な動作になります。
もとをたどれば、localStorage.nameをthis.nameに代入して、その値を再度localStorage.nameに代入しているからです。
ただし、2回目以降は「フォームの値に基づいてlocalStorage.nameを更新する」意味のある記述になります。
ma7ma7pipipiさんのコードでは、例えば2回目以降のアクセスでlocalStorageの値があったとしてもフォームに表示されないので、保存しておく意味が意味が(少なくとも今回の場面では)ないと思います。
また、ma7ma7pipipiさんのコードでは、(2)でコンポーネントのデータを更新しているにもかかわらず、(4)で再度代入していますが、これは無駄な動作です。watchで設定する関数は「データが更新された時に呼ばれる」関数であるからです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/22 05:41
2019/01/22 10:45 編集