前提・実現したいこと
- Vue.jsで、子コンポーネント内に定義されたメソッドを親コンポーネントから呼び出したい
- 子コンポーネントは親コンポーネントのループ内で呼び出している
- 呼び出せずにエラーになる
具体的には、記事一覧ページに表示されている個々の記事に編集ボタンを設け、
ダイアログ上で内容を更新できるようにしようとしています。
発生している問題・エラーメッセージ
記事更新しようとすると、ブラウザで見た時にコンソールに次のようなエラーが出ます。
app.js:36742 [Vue warn]: Error in v-on handler: "TypeError: Cannot read properties of undefined (reading 'update')"
該当のソースコード
↓親コンポーネント
vue
1<template> 2<v-card v-for="(inquiry,index) in inquiries" :key="inquiry.id" class="inquiry" flat :id="inquiry.id"> 3 <v-toolbar color="primary" dark dense> 4 <v-dialog max-width="90%" scrollable> 5 <template v-slot:activator="{ on, attrs }"> 6 <v-btn icon v-bind="attrs" v-on="on"> 7 <v-icon>mdi-square-edit-outline</v-icon> 8 </v-btn> 9 </template> 10 <template v-slot:default="dialog"> 11 <v-card> 12 <v-toolbar color="primary" dark>記録編集</v-toolbar> 13 <v-card-text> 14 <RecordForm :inquiry="inquiry" ref="RecordForm"></RecordForm> 15 </v-card-text> 16 <v-card-actions class="end"> 17 <v-btn text @click="edit(index,inquiry.id)">更新</v-btn> 18 <v-btn text @click="dialog.value = false">閉じる</v-btn> 19 </v-card-actions> 20 </v-card> 21 </template> 22 </v-dialog> 23 </v-toolbar> 24</v-card> 25</template> 26 27<script> 28 import RecordForm from '../layout/RecordForm' 29 30 export default { 31 components: { 32 RecordForm, 33 }, 34 mounted() { 35 axios.get('/api/inquiries/archive') 36 .then(response => { 37 this.inquiries = response.data.data.reverse() 38 }) 39 }, 40 methods: { 41 edit(index, id) { 42 console.log(index) 43 this.$refs.RecordForm[index].update(id) 44 }, 45 }, 46 } 47</script> 48
↓子コンポーネント(RecordForm.vue)
vue
1//js部分 2<script> 3 export default { 4 name: 'RecordForm', 5 props: ["inquiry"], 6 7 //中略 8 9 methods: { 10 postData(id) { 11 let postData = { 12 //(中略) 13 } 14 return postData 15 }, 16 update(id) { 17 let postData = this.postData(id) 18 axios.post('/api/inquiries/edit', postData) 19 .then(response => { 20 alert('更新しました。'); 21 console.log(response); 22 }) 23 }, 24 } 25 } 26</script>
試したこと
ここでは省略していますが、
親コンポーネントにおけるループ外の新規投稿ボタンから「子コンポーネント内に定義された新規投稿メソッド」を呼び出すことはできました。
なのでループの場合のみ起こる現象だと考えています。
下記の記事
https://qiita.com/gigazombie/items/6f53a1de17c370787eac
を見て、
- 親コンポーネントから子コンポーネントのメソッドを呼びたい時は$refsを使えば可能
- v-forの引数として提供されているindexを渡す必要がある
というところまでわかったのですが、その先に進めない状態です。
どなたか知恵を貸していただきたいです。
補足情報(FW/ツールのバージョンなど)
Vue2
Laravel8

回答1件
あなたの回答
tips
プレビュー