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

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

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

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

SPA(Single-page Application)

SPA(Single-page Application)は、単一のWebページのみでコンテンツの切り替えができるWebアプリケーションもしくはWebサイトです。ブラウザでのページ遷移がないため、デスクトップアプリケーションのようなUXを提供します。

Q&A

解決済

3回答

1462閲覧

Vueのv-forでなぜエラーにならないのか

suny

総合スコア48

Vue.js

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

SPA(Single-page Application)

SPA(Single-page Application)は、単一のWebページのみでコンテンツの切り替えができるWebアプリケーションもしくはWebサイトです。ブラウザでのページ遷移がないため、デスクトップアプリケーションのようなUXを提供します。

0グッド

0クリップ

投稿2020/07/01 09:06

railsとvueを使いSPAを作成しています。

そこで単一ファイルコンポーネント内で

<template> <div v-for='task in tasks'> // 省略 </div> </template> export default { data: function() { tasks: '' } }

のようなコードを書きました。

ここでtasksは配列ではなく、' ' であるのに

<div v-for='task in tasks'>

でエラーにならないのはなぜでしょうか?

v-forは配列もしくはハッシュに対して使うものだと思っていたので疑問です。

よろしくお願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

Vue.jsのv-forで反復する値には、配列、文字列、数値、オブジェクトを指定できます(公式サイト該当箇所)。


配列の場合、内部的には以下のように変換され処理されます(一部省略)。

html

1<template> 2 <div v-for="task in ['taskA', 'taskB', 'taskC']"> 3 // 省略 4 </div> 5</template>

javascript

1for (let i = 0; i < array.length; i++) { 2 render(array[i], i) // array[i]がtaskに対応する 3}

補足:render()は、templateのdiv要素を描画するための関数だと思ってください。


JavaScriptでは、文字列でも配列と同じように各文字にアクセスできます(MDN該当箇所(「文字列へのアクセス」の部分))。

javascript

1var chars = 'abc' 2console.log(chars[0]) // -> a

ですので、Vue.jsでは配列と同じようにfor-loopに変換して処理しています。

html

1<template> 2 <div v-for="task in 'tasks'"> 3 // 省略 4 </div> 5</template>

javascript

1for (let i = 0; i < array.length; i++) { 2 render(array[i], i) // array[i]がtaskに対応する 3}

ちなみに、render(array[i], i)となっていて、第2引数にfor-loopのindexを渡していますが、これはtemplateを以下のように書いた場合に使用できます。

html

1<template> 2 <div v-for="(task, index) in 'tasks'"> 3 // 省略 4 </div> 5</template>

Vue.js本体のソースコードに興味があれば、読んでみると公式サイトに書かれていることがどうやって実現されているか参考になると思います。

ソースコード該当部分

投稿2020/07/02 14:52

NozomuIkuta

総合スコア1260

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

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

suny

2020/07/03 01:58

ありがとうございます!
guest

0

文字列も配列化できるんでこんな風に書いたら
t
a
s
k
s
みたいになります。

html

1<div id="app"> 2<div v-for='task in "tasks"'> 3 <div>{{task}}</div> 4 </div> 5</div>

jsfiddle

投稿2020/07/01 13:47

sousuke

総合スコア3830

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

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

suny

2020/07/03 01:59

ありがとうございます!
guest

0

空でも文字列は文字列だからです。
そして、v-forは文字列に対しても実行でき、
一文字一文字が走査されます。

つまり、構文的にはエラーは起きませんが、
v-forの中身を実行せずに終えます。
空配列に対してと同じ動きかと。

投稿2020/07/01 10:33

編集2020/07/01 10:39
miyabi_takatsuk

総合スコア9555

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

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

miyabi_takatsuk

2020/07/01 10:37

ちなみに、JavaScriptにおいては、オブジェクトの事をハッシュとは言わないと思います。
suny

2020/07/03 02:02

ありがとうございます! 追加の指摘もありがとうございます。 とあるjavascriptの本のオブジェクトの説明部分で、 > ハッシュ、連想配列と呼ばれる場合もあります。 とあったのですが、やはりjavascriptではオブジェクトと呼ぶべきですね。
miyabi_takatsuk

2020/07/03 02:19

ですね。 ハッシュと呼ぶ言語も多々ありますが、 連想配列と言うものもありますし。 JavaScriptはそのどちらの言い方も相応しくないってのがあります。 なぜなら、全てがオブジェクトであり、 配列も、ObjectコンストラクターをオーバーライドしたArrayコンストラクタからできたあくまでもオブジェクトですので、 元が同じなので、区別できるものではありません。 また、JavaScriptにおいては、プリミティブな値にも、メソッドとプロパティが存在するため、本質的にはオブジェクトです。 代入時の参照の取り方が違うだけなんです。 まぁ、その書籍の通り、人が聞いてもイメージできる言葉で表す時は、確かにその方がわかりやすいっちゃわかりやすいですけどね。 ただ、やっぱ違うんですよね。 なので、せめて、配列とオブジェクトと呼称分けするってのが妥当だと思います。
suny

2020/07/03 06:54

詳しい説明までありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問