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

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

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

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

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1306閲覧

【Vue.js】アルファベットの配列をスマートに作成したい

ttkun

総合スコア30

Vue.js

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

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

1グッド

0クリップ

投稿2020/03/14 09:03

編集2020/03/17 01:05

vue.js(Nuxt.js)で連続したアルファベットのファイルを作成しv-forで繰り返し出力しようとしました。
そのときscript内で配列からimageファイルを作成しtemplateに出力する方法がうまくないか調べています。

ファイルの作成

images/logo-a.png

こんな感じのファイルをアルファベット順に作成していきます。

images/logo-a.png images/logo-b.png images/logo-c.png images/logo-d.png images/logo-e.png

配列の作成

次に配列を作成します。

javascript

1var alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];

配列をスマートに

ちょっとスマートじゃなかったのでこちらのサイトを参考にそのままですが作ってみました。
JavaScriptでアルファベットの配列をスマートに作る

javascript

1function Range(first, last) { 2 var first = first.charCodeAt(0); 3 var last = last.charCodeAt(0); 4 var result = new Array(); 5 for(var i = first; i <= last; i++) { 6 result.push(String.fromCodePoint(i)); 7 } 8 return result; 9} 10 11var alphabet = Range('A', 'Z');

アルファベットの配列を取得してv-forで出力する

こちらをまとめると下記のソースになります。

vue

1<template lang="pug"> 2 section.py-12 3 v-container.mt-12.mb-6 4 div(class="d-flex flex-wrap") 5 .card(v-for="alphabet in alphabets" :key="alphabet.id") 6 img(:src="`/images/logo-${alphabet}.png`") 7</template> 8 9 10<script> 11export default { 12 data () { 13 function Range(first, last) { 14 var first = first.charCodeAt(0); 15 var last = last.charCodeAt(0); 16 var result = new Array(); 17 for(var i = first; i <= last; i++) { 18 result.push(String.fromCodePoint(i)); 19 } 20 return result; 21 } 22 var alphabets = Range('A', 'Z'); 23 return { 24 alphabets, 25 } 26 }, 27} 28</script>

こちらでも画像ファイルは出力するのですが、img部分をscript内に収めtemplate内をもっとスマートにしたいと思い。

img(:src="`/images/logo-${alphabet}.png`")

このような書き方をしたのですがうまく表示されません。

vue

1<template lang="pug"> 2 section.py-12 3 v-container.mt-12.mb-6 4 div(class="d-flex flex-wrap") 5 .card(v-for="alphabet in alphabets" :key="alphabet.id") 6 img(:src="alphabet.logoimage") 7</template> 8 9 10<script> 11export default { 12 data () { 13 function Range(first, last) { 14 var first = first.charCodeAt(0); 15 var last = last.charCodeAt(0); 16 var result = new Array(); 17 for(var i = first; i <= last; i++) { 18 result.push(String.fromCodePoint(i)); 19 } 20 return result; 21 } 22 var alphabets = Range('A', 'Z'); 23 for(var j = 0; j < alphabets.length; j++) { 24 alphabets.push({ 25 logoimage: `/images/home/logo-${this.alphabets}.png` 26 }) 27 }; 28 return { 29 alphabets, 30 } 31 }, 32} 33</script>

dataの外の配列をscript内で回してv-forまで持っていく方法をさがしています。
従来のv-forでのやり方は検索したらでてくるのですがこのやり方の調べ方がよくないのかいまいち調べきれておりません。

配列されたものをscript内で回しtemplateで出力する方法のロジックや調べ方などの回答をお願いします。

s.k👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題点は2つ

問題点は2つあります。

  1. 無限ループしている
  2. templateで必要としてるオブジェクトが作成できていない

1. 無限ループしている

alphabets作成後に実行しているfor文で無限ループを起こしています。

js

1for(var j = 0; j < alphabets.length; j++) { 2 alphabets.push({ 3 logoimage: `/images/home/logo-${this.alphabets}.png` 4 }) 5};

ループはalphabets.lengthの数だけ繰り返します。
最初、alphabetsにはA~Zの26個格納されています。

ループ内の処理でalphabetsに新たな値を格納しています。つまり、alphabets.lengthはループ内の処理が実行されるたびに27, 28...と増えていきます。
ループ処理を繰り返すたびに増え続けるのでこのfor文は永遠と終わらず、無限ループしてしまいます。

2. templateで必要としてるオブジェクトが作成できていない

pugで書かれたtemplateには以下のように定義されています。

.card(v-for="alphabet in alphabets" :key="alphabet.id") img(:src="alphabet.logoimage")

alphabetsという配列の中には以下のようなオブジェクトがA~Zの26個格納されていることを必要としています。

json

1{ 2 "id": "A", 3 "logoimage": "/images/home/logo-A.png" 4}

つまり、上記のようなオブジェクトの配列をdataで作成する必要があります。

解決策

  1. 無限ループを起こさない
  2. idlogoimageを持つオブジェクトを配列に格納する

この2点を対応します。

解決方法1: alphabetsとは別の配列を用意する

新たにalphabetObjectsという配列を用意し、そちらにtemplateで必要としているオブジェクトを格納していきます。

js

1data() { 2 function Range(first, last) { 3 var first = first.charCodeAt(0); 4 var last = last.charCodeAt(0); 5 var result = new Array(); 6 for (var i = first; i <= last; i++) { 7 result.push(String.fromCodePoint(i)); 8 } 9 return result; 10 } 11 var alphabets = Range("A", "Z"); 12 var alphabetObjects = []; //idとlogoimageを持つオブジェクトを格納するための配列を用意 13 for(var j = 0; j < alphabets.length; j++) { 14 alphabetObjects.push({ // alphabetsではなくalphabetObjectsにオブジェクトを追加する 15 id: alphabets[j], // idの定義を追加 16 logoimage: `/images/home/logo-${alphabets[j]}.png` // this.alphabets -> alphabets[j]に変更 17 }) 18 }; 19 20 return { 21 alphabets: alphabetObjects 22 }; 23}

解決方法2: map関数を使う。

Arrayのmap関数を使ってtemplateで必要としているオブジェクトの配列を作成します。
個人的には余計な変数を定義せずに済むのでこちらの書き方を好みます。

js

1data() { 2 function Range(first, last) { 3 var first = first.charCodeAt(0); 4 var last = last.charCodeAt(0); 5 var result = new Array(); 6 for (var i = first; i <= last; i++) { 7 result.push(String.fromCodePoint(i)); 8 } 9 return result; 10 } 11 var alphabets = Range("A", "Z"); 12 return { 13 alphabets: alphabets.map(alphabet => { 14 return { 15 id: alphabet, 16 logoimage: `/images/home/logo-${alphabet}.png` 17 }; 18 }) 19 }; 20}

投稿2020/03/17 07:52

70_10

総合スコア65

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

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

ttkun

2020/04/12 02:16

丁寧に解説ありがとうございます。 こんなやり方があったのですね。大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問