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

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

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

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

JavaScript

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

Q&A

解決済

3回答

2532閲覧

v-forでランダムに配列から文字列を出力したい

1042limit

総合スコア29

Vue.js

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

JavaScript

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

0グッド

1クリップ

投稿2018/08/04 14:57

Vue.js初学者です。
v-forを用いて配列をランダムに表示したいです。

<div id="app"> <span v-for="n in 5" >{{random}}</span> </div> <script> var app = new Vue({ el: '#app', data: { randon = 0; }, var ary = ['1','2','3','4','5','6']; this.random = ary[Math.floor(Math.random() * ary.length)]; }) </script>

のように書いて配列からランダムに5個表示させる(重複は可)で表示させるプログラムを書きたいのですが、ここから先どう書けばいいかがわかりません。
ご教授のほどよろしくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

Vue.js以前の問題として、JavaScriptの文法がすでにいろいろおかしいです。まずはそちらから勉強されたほうが良いでしょう。

##JavaScriptの文法誤り箇所
まず、8~10行目、

JavaScript

1data: { 2 randon = 0; 3}

ですが、オブジェクトリテラル({ ~ })内のプロパティ宣言は、key:valueという形式で記述する必要があります。
つまり、

JavaScript

1data: { 2 random : 0 3}

が正しいでしょう。

つづいて11~12行目、こちらもオブジェクトリテラル内ですので、やはりkey:valueという形式でのプロパティ宣言しかできません。
ここは正直何をしたいのかよくわからないので、修正コードは書けませんが……

##Vue.js の書き方
2行目の{random} 部分は、Vue オブジェクトの random という値を取得する、という表記になっています。これでは、JavaScript でどういう処理をしようと、同じ値が5回出現します。

なので、ここは特定の値を取得するのではなく、ループの度に値を計算するように書き換えましょう。
スクリプトで random 関数を Vue インスタンスに登録するとして、 HTML 側の表記は以下になります。

html

1<div id="app"> 2 <span v-for="n in 5" >{{random()}}</span> 3</div>

スクリプト側では、以下のようにして random() メソッドを Vue インスタンスに登録します。

JavaScript

1new Vue({ 2 methods:{ 3 'random': function(){ 4 const rnd = Math.floor(Math.random() * this.ary.length); 5 return this.ary[rnd]; 6 } 7 } 8})

メソッド内で利用しているthis.aryが設定されていないので、これはデータとして登録します。
先ほどと同様に、Vue コンストラクタに

JavaScript

1new Vue({ 2 data: { 3 ary: ['1','2','3','4','5','6'] 4 }, 5})

とします(実際には、先ほどの methods 登録と一緒に data を登録します)。

##コード全文
上記をふまえ、ご質問の内容を実現するには、

html

1<div id="app"> 2 <span v-for="n in 5" >{{random()}}</span> 3</div> 4<script> 5 new Vue({ 6 el: '#app', 7 data: { 8 ary: ['1','2','3','4','5','6'] 9 }, 10 methods:{ 11 'random': function(){ 12 const rnd = Math.floor(Math.random() * this.ary.length); 13 return this.ary[rnd]; 14 } 15 } 16 }) 17</script>

というコードが必要になります(もちろん他のアプローチもあります)。

投稿2018/08/04 17:00

R.Mizukami

総合スコア1086

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

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

1042limit

2018/08/05 06:29

丁寧にご説明していただきありがとうございます。 参考になりました。 これを参考にもう少し理解を深めていきたいと思います。
guest

0

まず、vue.jsを触る前にJavaScriptで配列の中身がランダムで出力される関数を作成するところから始めることをおすすめします。
vue.jsは変数の持ち方、thisの持ち方、関数の持ち方、returnの持ち方、変数の持ち方など、vue.jsのみならずjsフレームワークは所謂JavaScriptの総合格闘技です。

今回のプログラム内容

  1. vue.jsの算出プロパティ(computed)を使用しています。
  2. 算出プロパティの中ではaryの回数分だけランダム関数の中身が実行されます。
  3. その結果をランダム関数の中で新たに作成した配列の中に追加してきます。
  4. htmlのv-forではn in 関数にしています(ココらへんがreturnが理解していないと難しいです)。

関数の中にはランダム関数の中で新たに作成した配列が入っております。
5. n in random(numArry){{ n }} 配列数だけ出力されます。

サンプルを作成したのでご確認ください。
動くサンプル

html

1<div id="app"> 2 <span v-for="n in random">{{ n }} </span> 3</div>

javascript

1var app = new Vue({ 2 el: '#app', 3 data: { 4 ary: [1, 2, 3, 4, 5], 5 numArray: '' 6 }, 7 computed: { 8 random: function () { 9 let numArray = [] 10 this.ary.forEach(num => { 11 numArray.push(this.ary[Math.floor(Math.random() * num)]) 12 }) 13 return numArray 14 } 15 } 16})

投稿2018/08/04 23:45

編集2018/08/04 23:49
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

1042limit

2018/08/05 06:30

丁寧にご説明していただきありがとうございます。 参考になりました。 これを参考にもう少し理解を深めていきたいと思います。
guest

0

配列からランダムに任意の個数取り出す関数を書いてみました。これを使ってみてください。

あと文法が色々と間違ってるので JavaScript をもう少し勉強してから Vue.js の勉強を進めたほうが良いかなと思います。

javascript

1function getRandomArray(ary, length) { 2 return Array.apply(null, Array(Math.min(length, ary.length))).map(function () { 3 const randomIndex = Math.floor(Math.random() * ary.length); 4 5 return ary.splice(randomIndex, 1)[0]; 6 }); 7}

javascript

1data: function() { 2 return { 3 ary: ['1','2','3','4','5','6'], 4 }; 5}, 6 7computed: { 8 random: function () { 9 return getRandomArray(this.ary, 5); 10 }, 11},

html

1<span 2 v-for="n in random" 3 :key="n"> 4 {{ n }} 5</span>

投稿2018/08/04 17:26

yhg

総合スコア2161

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問