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

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

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

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

JavaScript

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

Q&A

解決済

1回答

3345閲覧

【Vue.js】特定のclassを持つ要素全ての合計値を算出して表示したい。

m.kosuda

総合スコア153

Vue.js

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

JavaScript

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

0グッド

0クリップ

投稿2018/07/10 08:57

編集2018/07/10 09:05

タイトルの通りです。
クラスでなくても良いので共通する属性、属性値が一致する要素が変更された場合、算出プロパティによる同期をしたいというのが目的です。
下記の要素郡があります。

html

1<div id="inputArea"> 2 <input type="number" v-model="item_0" class="im-item" /> 3 <input type="number" v-model="item_1" class="im-item" /> 4 <input type="number" v-model="item_2" class="im-item" /> 5 <input type="number" v-model="item_3" class="im-item" /> 6 <input type="number" v-model="item_sum" readonly /> 7</div>

item_0~3を変更したらitem_sumに算出プロパティで集計後反映したい。

javascript

1//【動作しないがやりたことはこういう感じ】 2// 下記の記述だとitem_0~3の中身が変わっても算出プロパティが動かない。 3vue_calc = new Vue({ 4 el: "#inputArea", 5 data: { 6 item_0 : 0, 7 item_1 : 0, 8 item_2 : 0, 9 item_3 : 0 10 }, 11 computed:{ 12 item_sum: function (){ 13 // 動かないが下記のようなことをやりたい 14 var sum = 0; 15 $('input.im-item').each(function() { 16 sum += Number($(this).val()); 17 }); 18 return sum; 19 }, 20 21 }, 22})

下記の記述だとアウトプット的には期待する動作だが、冗長すぎる。

javascript

1//【動作するが冗長】 2vue_calc = new Vue({ 3 el: "#inputArea", 4 data: { 5 item_0 : 0, 6 item_1 : 0, 7 item_2 : 0, 8 item_3 : 0 9 }, 10 computed:{ 11 item_sum: function (){ 12 // itemが1000個あったら物理的に1000個書かなくてはならない。 13 var sum = 0; 14 sum = (this.item_0 + this.item_1 + this.item_2 + this.item_3); 15 return sum; 16 }, 17 18 }, 19})

一応下記に使用ライブラリを共有します。
・jquery3.3.1
・vue.js2.5.16

こちら、当該問題を解決したくべくヒントを頂ければ幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

item_0, item_1... のような形ではなく、配列にしてしまえば良いのではないでしょうか。

javascript

1vue_calc = new Vue({ 2 el: "#inputArea", 3 data: { 4 // 長さ 10 の 0 埋めした配列を生成 5 items: Array.apply(null, Array(10)).map(function () { return 0 }), 6 }, 7 computed:{ 8 item_sum: function (){ 9 return this.items.reduce(function (sum, cur) { 10 return sum + parseInt(cur, 10); 11 }, 0); 12 }, 13 }, 14})

注意点は、items 配列の要素を v-model に使いたい場合は v-for の一時変数 item ではなく items[index] としなければならないところ。

html

1<div id="inputArea"> 2 <input 3 v-for="(item, index) in items" 4 :key="index" 5 v-model="items[index]" 6 type="number" 7 class="im-item" /> 8 <input type="number" :value="item_sum" readonly /> 9</div>

投稿2018/07/10 09:56

yhg

総合スコア2161

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問