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

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

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

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

Q&A

1回答

1501閲覧

vueでdataに渡した配列の要素の取り出し方について

tmp-user

総合スコア44

Vue.js

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

0グッド

0クリップ

投稿2022/04/12 04:45

vueでdataに渡した配列の要素をHTMLで表示したいのですが、
以下のような記述では表示できないのですが
どういった制限があるのでしょう?

[0]を指定せず、data.arrayを指定した際には["XXX", "YYY", "ZZZ"]と取得できるので原因が気になります。

HTML

1<div id="app"> 2 <!-- 表示される --> 3 {{data.array}} 4 5 <!-- エラーになる --> 6 {{data.array[0]}} 7</div> 8 9<script> 10const obj = { 11 id: "obj001", 12 array: [ 13 "XXX", 14 "YYY", 15 "ZZZ", 16 ], 17}; 18 19const myApp = { 20 data() { 21 return { data: "" }; 22 }, 23 mounted() { 24 this.data = obj; 25 }, 26}; 27const app = Vue.createApp(myApp); 28app.mount("#app"); 29</script> 30

成功する記述

以下のように記述すると問題なく表示されるのですが、
配列の要素をHTMLから取得する場合は、
data()に予め配列用のプロパティを準備するのが必須なのでしょうか?

HTML

1<div id="app"> 2 <!-- 表示される --> 3 {{myArray[0]}} 4</div> 5 6<script> 7const myApp = { 8 data() { 9 return { 10 data: "", 11 myArray: [] 12 }; 13 }, 14 mounted() { 15 this.data = obj; 16 this.myArray = obj.array; 17 }, 18}; 19const app = Vue.createApp(myApp); 20app.mount("#app"); 21</script> 22

※Vueはバージョン3です

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

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

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

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

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

believe

2022/04/12 05:04

alert(data);でデバックしてみて undefinedと表示されないでしょうか?
guest

回答1

0

vueはjsがエラーを吐くとその時点で落ちてしまうのでエラーが出ないようにしないといけません。
{{data.array[0]}}が記載されていると常時これを解決して値を取りに行きます。

やっていることを普通のjsのコンソールで書くと

javascript

1var data = "" 2 3data.array[0]

こんな感じのことをしているので「data.array」はundefinedですし
undefined[0]なんて取得できないのでエラーです。

{{data.array}}は最初undifiled(エラーではない)ですがmountedによって
値が与えられた結果["XXX", "YYY", "ZZZ"]が表示されているという2段階の動作によって表示されています。

ちなみにインスタンス作成時のcreatedというのがありますので
moutedの代わりにそちらを使えばエラーは出なくなると思いますが
そもそもobjを最初から入れておけばいいのでは?とも思います。

javascript

1 data() { 2 return { data: obj }; 3 }, 4 /*mounted() { 5 this.data = obj; 6 },*/

投稿2022/04/12 05:08

sousuke

総合スコア3830

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

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

tmp-user

2022/04/13 06:38

ありがとうございます。 mounted前にデータを参照してしまっているんですね。 確かにcreatedを使えば正しくデータが取得できました。 mounted→レンダリング前に実行 created→レンダリング後に実行 という認識であっているでしょうか。 ただ、一点まだ理解ができていないのですが、 ` return { data: "", myArray: [] }; ` という記述をしたときに参照できるのはなぜなのでしょう? 同じくmountedしているので何が違うのかが気になりました。
sousuke

2022/06/03 00:47

気づくのがだいぶ遅くなりましたが一応。 myArrayの方でできるのはundefinedではないからです。 var data = "" とした場合「{{data.array[0]}}」はdata.arrayがundefinedです。 var myArray = [] とした場合「{{myArray[0]}}」はmyArrayは空の配列で初期化されているので エラーではないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問