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

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

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

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

Q&A

解決済

1回答

379閲覧

Vue.jsでのコンポーネント記述

shockatz

総合スコア22

Vue.js

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

0グッド

0クリップ

投稿2019/11/06 12:29

Vueで作成中の座席予約Webサイトについてご教示いただければありがたいです。
イメージとしては劇場など、座席を指定するイメージです。
コンポーネントのプロパティを親のオブジェクト値とリアクティブにさせたいです。親側の"stats"(全座席の予約状況)はAjaxで随時更新され、それに従って子コンポーメントに付与されるクラスが変わる’
できれば双方向に。子側でプロパティstatの値を変更すると、親側のオブジェクトstatsも変更されるようにしたいです。

HTML

1<st id="A1"></st> 2<st id="A2"></st>

Javascript

1var seat = { 2 template: "<div class='s' :class='cssclass'></div>", 3 props: ['id'], 4 data: function() { 5  return { stat: 0 // この値を親の配列要素とリアクティブにしたい } 6 }, 7 computed: { 8  cssclass: function () { return ('s' + this.stat); } 9 } 10}; 11 12var vm = new Vue({ 13 el: '#app', 14 components: { 'st':seat }, 15 data: { 16  stats:{ }, // この値をAjaxでセット { A1:0, A2:3..} 17 }, 18});

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

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

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

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

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

guest

回答1

0

ベストアンサー

子から親への情報の受け渡しはemitによって可能です。
ただ書かれているコードではどういったときに値を更新するか分からないので数値をインクリメントする簡単なサンプルを記載しておきます。

html

1<div id="app"> 2 <template v-for="(item, index) in counter"> 3 <seat :index="index" :seat="item" @increment="update" /> 4 </template> 5</div>

javascript

1const seat = { 2 template: '<div>{{ seat }}<button type="button" @click="increment">+</button></div>', 3 props: ['index', 'seat'], 4 methods: { 5 increment() { 6 this.$emit('increment', { index: this.index, val: this.seat + 1 }) 7 } 8 } 9}; 10 11new Vue({ 12 el: "#app", 13 components: { 14 seat 15 }, 16 data() { 17 return { 18 counter: [...Array(5).fill(0)] 19 } 20 }, 21 methods: { 22 update({ index, val }) { 23 this.counter[index] = val 24 this.$forceUpdate() // 描画更新用 25 } 26 }, 27})

今回のような簡単な例でしたら問題ありませんが、規模が大きくなりコンポーネントがかさむとバケツリレーとなりデータの管理が辛くなります。そういった場合はVuexを導入されたほうが良いかもしれません。

投稿2019/11/07 07:10

nt4c

総合スコア768

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

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

shockatz

2019/11/08 12:37

有意義な回答ありがとうございます。ただちょっと要件と違うというか。。 飛行機の座席指定と同じで、初期状態として全体の予約状態(statsという配列)の表示があり、そこで空いている座席(seat)をクリックすれば仮予約が入り、さらにクリックすれば仮予約が外れるというイメージです。 座席は動的に生成されるのはなく最初からそこに、自身のIDをもって存在しています。 その上で、各座席の予約状態(stat)は全体の予約状態(stats)にリアクティブに同期しなければいけません。
nt4c

2019/11/11 01:53

回答した内容を応用すれば問題ない要件のように思えます。 forで書かず座席一つ一つを記載して親の値(予約状態)を子へ注入。子が変更されたときに親へ受け渡しという形でできると思いますので`emit`の動作を理解していただければと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問