実現したいこと
Vue.jsでモーダルの状態を親コンポーネントで動的に管理したい
状況
- Vue Materialのテーブルコンポーネントを使用
- Modalコンポーネントを作成し、ラップした要素をモーダル表示できるように実装(今回はFormコンポーネントをラッピング)
Parent.vue
でmodalState
を定義し、Parent.vue
で子であるモーダルの状態を管理
↑のような状況で親であるParent.vue
でモーダルの状態を保持し、ボタンを押すことで、子のモーダルが表示されるようにしたい。
問題の箇所
Parent.vue
で定義したモーダルの状態を子であるModal.vue
に渡すと、全てのモーダルが表示されてしまう。
【Modal.vue】
Vue
1<md-dialog :md-active.sync="modalState"> ←全てのモーダルがtrueになってしまう 2 <md-dialog-content> 3 <slot name="content" /> 4 {{ itemId }} 5 </md-dialog-content> 6</md-dialog>
問題箇所のアニメーションgif
該当のソースコード
【Parent.vue】
Vue
1<template> 2 <div> 3 <md-table v-model="products"> 4 <md-table-row slot="md-table-row" slot-scope="{ item }"> 5 <md-table-cell md-label="ID">{{ item.id }}</md-table-cell> 6 <md-table-cell md-label="ユーザー">{{ item.user }}</md-table-cell> 7 <md-table-cell md-label="アクション"> 8 <button @click="modalStateTrue">モーダル表示</button> 9 <Modal :item-id="item.id" :modal-state="modalState"> ←モーダルの状態をpropsで渡す 10 <template #content> 11 <Form :item-id="item.id" /> ←modalStateがtrueならフォームを表示させる 12 </template> 13 </Modal> 14 </md-table-cell> 15 </md-table-row> 16 </md-table> 17 </div> 18</template> 19 20<script lang="ts"> 21import Form from './components/Form.vue' 22import Modal from './components/Modal.vue' 23import Vue from 'vue' 24 25export default Vue.extend({ 26 name: 'Table', 27 components: { 28 Modal, 29 Form, 30 }, 31 data() { 32 return { 33 products: [ 34 { 35 id: 1, 36 user: 'ユーザー1', 37 }, 38 { 39 id: 2, 40 user: 'ユーザー2', 41 }, 42 ], 43 modalState: false, 44 } 45 }, 46 methods: { 47 modalStateTrue() { 48 this.modalState = true 49 }, 50 }, 51}) 52</script>
【Modal.vue】
Vue
1<template> 2 <div> 3 <md-dialog :md-active.sync="modalState"> ←全てのモーダルがtrueになってしまう 4 <md-dialog-content> 5 <slot name="content" /> 6 {{ itemId }} 7 </md-dialog-content> 8 </md-dialog> 9 </div> 10</template> 11 12<script> 13import Vue from 'vue' 14 15export default Vue.extend({ 16 name: 'Modal', 17 props: { 18 modalState: { 19 type: Boolean, 20 }, 21 itemId: { 22 type: Number, 23 default: null, 24 }, 25 }, 26}) 27</script>
【Form.vue】
Vue
1<template> 2 <div id="itemId"> 3 <input /> 4 </div> 5</template> 6 7<script lang="ts"> 8import Vue from 'vue' 9 10export default Vue.extend({ 11 name: 'Form', 12 props: { 13 itemId: { 14 type: Number, 15 required: true, 16 }, 17 }, 18}) 19</script>
試したこと
親から子であるModalに対してユニークなIDを渡し、DOM要素のIDとして追加する
【Parent.vue】
Vue
1<button @click="modalStateTrue(item.id)">モーダル表示</button> 2<Modal :item-id="item.id" :modal-state="modalState.state"> ←propsのitemIdを使用 3 <template #content> 4 <Form :item-id="item.id" /> 5 </template> 6</Modal>
【Modal.vue】
Vue
1<md-dialog :id="itemId" :md-active.sync="modalState"> ←要素にユニークなIDを与える 2 <md-dialog-content> 3 <slot name="content" /> 4 {{ itemId }} 5 </md-dialog-content> 6</md-dialog>
↑のようなコードにした所、IDはモーダルアイテムごとに渡っていることを確認できましたが、
全てのモーダルが一度で表示される状態は変わりませんでした。
ご教示いただきたいこと
Vue.jsでモーダルの状態を親コンポーネントで管理する方法
良い書き方が中々思い浮かばず詰まった末、質問させていただきました。
お手数をおかけし大変恐縮ですが、何卒宜しくお願い申し上げます。
【追伸】
↓以前似たような質問をしておりますが、そちらでは親から$ref
を使用して子のメソッドを操作する質問でしたが、今回は親で状態管理の質問になります。
【Vue.js】モーダル内の要素にテーブルの行ごとのIDを渡したい
応用が効かずに誠に恥ずかしい限りなのですが、ご指導賜りますようお願い申し上げます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/07 06:08