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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア1086
0
まず、vue.js
を触る前にJavaScript
で配列の中身がランダムで出力される関数を作成するところから始めることをおすすめします。
vue.js
は変数の持ち方、this
の持ち方、関数
の持ち方、return
の持ち方、変数
の持ち方など、vue.js
のみならずjsフレームワーク
は所謂JavaScriptの総合格闘技
です。
今回のプログラム内容
- vue.jsの算出プロパティ(computed)を使用しています。
- 算出プロパティの中では
ary
の回数分だけランダム関数の中身が実行されます。 - その結果をランダム関数の中で新たに作成した配列の中に追加してきます。
- 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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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
総合スコア2161
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/05 06:29