🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

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

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

Q&A

解決済

2回答

1235閲覧

v-forを使って表示させたtable内にあるinputを監視したい

yotubarail

総合スコア23

Vue.js

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

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

0グッド

0クリップ

投稿2021/02/10 13:12

v-forを使ってitemsの中身をtableに表示させ、table内にあるinputに入力された値が初期値と比べて更新されていた場合に更新ボタンが押せる様にしたいと考えています。

itemsの中身が少ない時は

this.preprice != this.items[0].price | this.preprice != this.items[1].price

の様にひとつひとつ比較をしていくことができますが、数が増えた場合にはこのやり方では良くないと考えています。

何番目のinputが更新されたかを監視できればと思うのですが、やり方がわからずにいます。
どなたか良い方法がお分かりになる方がいらっしゃいましたら、ご教授いただけると幸いです。

コードの全文は以下の通りです。

vue

1<template> 2 <div class="container"> 3 <table class="table table-border"> 4 <thead> 5 <tr> 6 <th>名前</th> 7 <th>値段</th> 8 </tr> 9 </thead> 10 <tbody> 11 <tr v-for="(item, index) in items" :key="index"> 12 <td>{{ item.name }}</td> 13 <td> 14 <input type="text" class="form-control form-control-sm" v-model="item.price"> 15 </td> 16 </tr> 17 </tbody> 18 </table> 19 <button class="btn btn-primary" :disabled = !updatePrive>更新</button> 20 </div> 21</template> 22 23<script> 24export default { 25 data() { 26 return { 27 items: [{ 28 name: "肉", 29 price: 0 30 }, 31 { 32 name: "野菜", 33 price: 0 34 }], 35 // 初期値 36 preprice: 0 37 } 38 }, 39 computed: { 40 updatePrive() { 41 if (this.preprice != this.items[0].price | this.preprice != this.items[1].price) { 42 return true 43 } 44 return false 45 } 46 } 47} 48</script>

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

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

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

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

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

guest

回答2

0

ベストアンサー

ご質問拝見いたしました。

初期値が固定されているのであれば、some関数を利用するのはいかがでしょうか。

vue

1 computed: { 2 updatePrive: function() { 3 // 変更がある場合:true 変更がない場合:false 4 return this.items.some(item => item.price !== this.preprice); 5 } 6 }

ちなみにボタンのdisabled属性は以下かなと思いました。

diff

1- <button class="btn btn-primary" :disabled = !updatePrive>更新</button> 2+ <button class="btn btn-primary" :disabled="!updatePrive">更新</button>

ご参考になれば幸いです。

投稿2021/02/10 15:40

Twoshi

総合スコア354

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

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

yotubarail

2021/02/10 16:16

ありがとうございます。 無事変更したかどうか監視できる様になりました。 今後inputごとに初期値を変更したくなった場合に考え方の参考になるものなどありましたら、教えていただけますか。
Twoshi

2021/02/10 16:52

ご確認いただきありがとうございます! 想定通りの動きとなり幸いです。 > 今後inputごとに初期値を変更したくなった場合に考え方 こちらについてですが、some関数は第二引数にindexを取得することもできます。 そのため、例えば変更前と変更後の配列をそれぞれ持っておき変更前と変更後で変更があったかどうかを比較することもできると思います。 例えば this.items.some((item, index) => item.price !== this.beforeItems[index].price);のような方法が考えられます。※this.beforeItems(変更前の配列) 今後どのようなソースにしていくかにもよってsome関数じゃない方法の方が良い場合もありますので、一概には言えませんが、、、 今後のご参考になればと思いますm(_ _)m
guest

0

・v-forの中にコンポーネントを入れて、それぞれで別々のcomputed関数を持たせる
・v-for全体に対するcomputed関数で処理する。(現状のやつ)
・関数を返すようなcomputed関数を定義してしまう*
(*https://qiita.com/kambe0331/items/36210147a5aaab3f0d73)

投稿2021/02/10 14:23

aoies

総合スコア331

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問