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

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

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

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

JavaScript

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

Q&A

解決済

2回答

710閲覧

Vue.js オブジェクト型の値更新タイミングについて

ya_penguin

総合スコア5

Vue.js

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

JavaScript

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

0グッド

0クリップ

投稿2022/04/14 05:48

編集2022/04/14 08:46

前提・実現したいこと

独学でVue.jsを学習しながら入力画面を作っています。
エラー変数の初期化→エラーチェックの順でオブジェクト型の変数を更新したいと考えております。
データが代入されたかどうか確認するために、console.logを利用して確認を行っております。
知見が浅くプロパティを指定したときとオブジェクトを指定したときで表示が異なる理由が分からず困っております。
「何故cosole.logで出力時に想定していた内容で出てこないのか?」をご教授いただければ幸いです。

発生している問題・エラーメッセージ

zipcodeの出力結果がisError:false,messages:nullと表示されない理由が知りたいです
プロパティを個別で指定してconsole.logを行うと初期化されていることが分かりましたが、オブジェクト指定で出力した場合と内容が異なっており正常に初期化されているのか分からないため表示が異なる理由が知りたいです。

// 結果 エラー初期化 false null {  zipcode: {   isError:true,   messages:Array(1)    0: '郵便番号から住所を取得できませんでした。' } }

該当のソースコード

main.vue

1<template> 2 <div id="app"> 3 <input type="text" v-model="address.zipcode"> 4 <button @click="search">検索</button> 5 <!-- 省きます --> 6 </div> 7</template> 8<script> 9export default { 10 data(){ 11 return { 12 address:{ 13 zipcode: "", 14 address1: "", 15 address2: "", 16 }, 17 error: { 18 zipcode: {isError:false, messages:null}, 19 address1: {isError:false, messages:null}, 20 address2: {isError:false, messages:null}, 21 }, 22 } 23 }, 24 methods: { 25 search(){ 26 // エラー変数初期化 27 this.errorInitialization('zipcode'); 28 // データ取得ロジック 29 // エラーメッセージの追加 30 this.errorAddMessage('zipcode','郵便番号の住所を取得できませんでした'); 31 }, 32 errorInitialization(errorTarget){ 33 // エラー初期化 34 console.log('エラー初期化'); 35 this.$set(this.error[errorTarget],'isError',false); 36 this.$set(this.error[errorTarget],'messages', null); 37 // データが初期化されたか確認 38 console.log(this.error[errorTarget].isError); 39 console.log(this.error[errorTarget].messages); 40 // console.logした結果は初期化されていない 41 console.log(this.error); 42 }, 43 errorAddMessage(errorTarget,message){ 44 // エラーメッセージの追加 45 this.$set(this.error[errorTarget],'isError',true); 46 this.$set(this.error[errorTarget],'messages',[...this.error[errorTarget].messages??'',message]); 47 }, 48 } 49} 50</script>

試したこと

色々とネットで調べてみましたが、納得のいく内容が見つかりませんでした。
this.error[errorTarget].isError=false;という風に直接代入を行っておりましたが、Vue.$setに変更してみました。現象は変わりませんでした

補足情報(FW/ツールのバージョンなど)

Vue.js 2.5.17

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

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

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

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

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

ku__ra__ge

2022/04/14 08:21

質問として提示するコードは、文法エラーが出ないものを提示してください。
ya_penguin

2022/04/14 08:39

ご指摘ありがとうございます。単一コンポーネントとして動くように変更致しました
guest

回答2

0

ベストアンサー

ちゃんと初期化されています。
ブレークポイントをつけて確認してみてください。
https://teratail.com/questions/61338#reply-97357

投稿2022/04/14 07:58

編集2022/04/14 07:59
5ugarVVatch1ng

総合スコア356

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

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

ya_penguin

2022/04/14 08:48 編集

ご回答ありがとうございます。 console.logの詳しい動きが理解できました console.logの実行時点の内容ではないのですね。 よく書籍にはconsole.logで内容を確認していくものが多くデバッグ時もconsole.logを利用していましたが Array Object等は、ブレイクポイントを活用するようにしなくてはいけませんね 大変勉強になりました。ありがとうございます。
guest

0

zipcodeの出力結果がisError:false,messages:nullと表示されない

zipcodeという名前のデータは、address.zipcodeerror.zipcodeの2つ定義されています。

console.logで初期化されていることを確認しているのはerror.zipcodeです。
<input type="text" v-model="address.zipcode">で表示しているのはaddress.zipcodeです。
この2つは異なるデータなので、前者が正しく初期化されていても、後者にその値が表示されることはありません。

以下のようなテンプレートを表示すれば、画面に{ "isError": false, "messages": null }と表示されます。

html

1<template> 2 <div id="app"> 3 {{ error.zipcode }} 4 </div> 5</template>

投稿2022/04/14 08:22

ku__ra__ge

総合スコア4524

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

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

ya_penguin

2022/04/14 08:42 編集

ご回答ありがとうございます。 質問の意図がわかりずらく申し訳ございません。 何故cosole.logで出力時に想定していた内容で出てこないのか?が知りたかったので表示の箇所は考慮しておりませんでした。 デバッグで直接表示させるだけで内容が分かるものは、ku__ra__ge様の記述いただいた内容も活用します。 大変勉強になりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問