実現したいこと
Vue.jsでモーダルの中の要素にテーブルの行ごとのIDを渡したい
状況
- Vue Materialのテーブルコンポーネントを使用
- Modalコンポーネントを作成し、ラップした要素をモーダル表示できるように実装
- ChildFormコンポーネントを作成し、Modalコンポーネントでラッピング
- Parent.vueで
this.$refs.child
を使用し、ボタンをクリックすると子のModalにあるopenModal
を発火させる(こちらを参照にしました)
↑のような状況で親であるParent.vue
からChildForm.vue
にIDデータを渡したい。
問題の箇所
ChildForm.vue
にて、propsとして渡したitemId
を表示させようとしたが、常にID『2』がモーダルフォームに表示される
Vue
1<template> 2 <div> 3 {{ itemId }} 4 </div> 5</template>
問題箇所のアニメーション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="onClickOpenModal">ボタン</button> 9 <Modal ref="child"> ←親から子のメソッドにアクセスできるように実装 10 <template #content> 11 <ChildForm :item-id="item.id" /> 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 ChildForm from './ChildForm.vue' 22import Modal from './Modal.vue' 23import Vue from 'vue' 24 25type RefInterface = Vue & { 26 openModal(): void 27} 28 29export default Vue.extend({ 30 name: 'Parent', 31 components: { 32 Modal, 33 ChildForm, 34 }, 35 data() { 36 return { 37 products: [ 38 { 39 id: 1, 40 user: 'ユーザー1', 41 }, 42 { 43 id: 2, 44 user: 'ユーザー2', 45 }, 46 ], 47 } 48 }, 49 methods: { 50 onClickOpenModal() { 51 const child = this.$refs.child as RefInterface 52 child.openModal() 53 }, 54 }, 55}) 56</script>
【Modal.vue】
Vue
1<template> 2 <div> 3 <md-dialog :md-active.sync="active"> 4 <md-dialog-content> 5 <slot name="content" /> 6 </md-dialog-content> 7 </md-dialog> 8 </div> 9</template> 10 11<script lang="ts"> 12import Vue from 'vue' 13 14export default Vue.extend({ 15 name: 'Modal', 16 data() { 17 return { 18 active: false, 19 } 20 }, 21 methods: { 22 openModal() { 23 this.active = true 24 }, 25 }, 26}) 27</script>
【ChildModal.vue】
Vue
1<template> 2 <div> 3 {{ itemId }} ←IDを表示するも常に『2』のIDが表示されてしまう 4 </div> 5</template> 6 7<script lang="ts"> 8import Vue from 'vue' 9 10export default Vue.extend({ 11 name: 'ChildForm', 12 props: { 13 itemId: { 14 type: Number, 15 default: null, 16 }, 17 }, 18}) 19</script>
試したこと
Modalコンポーネント側でボタンを設置
【Modal.vue】
Vue
1<template> 2 <div> 3 <md-dialog :md-active.sync="active"> 4 <md-dialog-content> 5 <slot name="content" /> 6 </md-dialog-content> 7 </md-dialog> 8 <button @click="openModal">ボタン</button> 9 </div> 10</template>
↑のようなコードにした所、IDはデータに応じて表示されましたが、ボタンも今後種類が増えてCSS等変えていくと考えると、
0. ボタンもModalの外に設置する
0. Modalはあくまでモーダルビューを出すだけで、モーダル表示をさせたい要素をラッピングするだけの役割
で実装出来ればと考えているのですが、うまくいきませんでした。
ご教示いただきたいこと
テーブルコンポーネントで子コンポーネントに行ごとのIDを渡す方法
良い書き方が中々思い浮かばず詰まった末、質問させていただきました。
お手数をおかけし大変恐縮ですが、何卒宜しくお願い申し上げます。
回答1件
あなたの回答
tips
プレビュー