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

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

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

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

Q&A

解決済

1回答

1067閲覧

Vue.js 初心者です。コンポーネント内の値をすべて合計する方法が分かりません。

Web_akira

総合スコア34

Vue.js

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

0グッド

0クリップ

投稿2019/04/11 08:50

状況

Vue.js を使いだして、3日目です。

フォームのテキストエリアをコンポーネント化しています。

  • テキストエリア名、ラベル名、行数の初期値を渡して、展開されるようにしています。
  • input: number 型のボックスと、テキストエリアの rows (行数)をデータバインディングしています。

やりたいこと

  • コンポーネントの rows の値をどうやって合算すればいいか
  • 合計値を取得した後、最大値を超えていたら、加算された値を元に戻したい

コンポーネントで出力しているテキストエリアのすべての行数を合算し、最大値(ここでは20)を超えないようにしたいです。
ライフサイクルフックの updated か、computed を使えばタイミング的には拾えそうですが、うまくいきません。

html

1<div id="app"> 2 <div v-for="c in contentGroup"> 3 <textarea-component :label-name="c.name" :form-name="c.form" :row-start="c.start"></textarea-component> 4 </div> 5</div>

javascript

1var textareaComponent = { 2 template: ' 3 '<label :for="formName">{{ labelName }}</label>' + 4 '<textarea class="lined" :name="formName" :id="formName" cols="18" :rows="count" :disabled="isDisabled"></textarea>' + 5 '<input v-if="viewChk" class="rows_number" :name="componentName" type="number" min="0" v-model.number="count">', 6 data: function () { 7 return { 8 maxNum: 20, 9 componentName: this.formName + "_control", 10 count: this.rowStart, 11 isView: true 12 } 13 }, 14 props: { 15 labelName: String, 16 formName: String, 17 rowStart: String 18 }, 19 computed: { 20 // rows の初期値が1の場合、number ボックスは表示しない 21 viewChk: function () { 22 if (this.rowStart == "1") { 23 return false; 24 } else { 25 return true; 26 } 27 }, 28 // rows を編集して値が0になったら編集不可(disabledを有効)にする 29 isDisabled: function () { 30 if (this.count == 0) { 31 return true; 32 } 33 } 34 } 35}; 36 37var vm = new Vue({ 38 el: '#app', 39 data: { 40 maxNum: 20, 41 title_disabled: false, 42 job_type_control: "0", 43 sum: 0, 44 contentGroup: [ 45 {name: '店名', form: 'shop_name', start: "2"}, 46 {name: '勤務地', form: 'location', start: "3"}, 47 {name: '電話番号', form: 'telno', start: "1"}, 48 {name: 'その他', form: 'etc', start: "4"}, 49 ] 50 }, 51 computed: { 52 rowsSum: function () { 53 54 }, 55 }, 56 components: { 57 'textarea-component': textareaComponent 58 } 59 }) 60;

コンポーネント化する前は、個々に要素を書いて、データバインディングの設定をし、
Vue インスタンスの中の data に設定した値を computed で合算することができました。
やっている途中で、テキストエリアの部分が共通化できると考え、コンポーネント化してみたものの、
今度はデータの取り出し方が分からなくなりました…。

いったんは、jQuery で合算し、最大値を超えていたら力技で number型とテキストエリアの数値を変更したのですが、
連打すると変わってしまったり、うまくいきません…。

やろうとしていることは、コンポーネントでは無理なのでしょうか?
コンポーネントの役どころというものも思い違いをしているかも知れませんので、ご教示頂けますでしょうか。
よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Vueのバインディングは基本的に単方向です。

親コンポーネントと通信する方法がいくつかあります。

.sync 修飾子を使って実装するとしたらこんな感じでしょうか。
https://codesandbox.io/s/1v1y54qpm7

投稿2019/04/12 04:24

wtokuno

総合スコア448

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

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

Web_akira

2019/04/12 05:05

ありがとうございます! コードまでご提供いただき感謝です。 まだよく分かっていないので、じっくり勉強させて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問