🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

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

Q&A

解決済

1回答

276閲覧

Vue.jsのmethodsをJSONを返してイベントを発火させる方法について

退会済みユーザー

退会済みユーザー

総合スコア0

Vue.js

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

0グッド

0クリップ

投稿2019/11/26 06:05

編集2019/11/26 06:06

Laravelを使ってJSONを返すAPIを作成しました。
これをvue.jsに渡し、描画する処理を行いたいのですが、methodsshowイベントだけ動きません、、
以下のコードより、@click="article.show"の部分にmethodsのshow1が入るよう、JSONの内容が呼び出され、別コンポーネントで定義されているモーダルが表示させるコードとなっています。
show1はJSONのなかに入っていますが、あまりこの方法でイベントを発火させるべきだとは思っていません...
何か他に良い方法があれば教えていただきたいです。

vue.js

1<template> 2 <v-app> 3 <v-row justify="center" style="margin: 0" > 4 <v-col v-for="(article, id) in articles" :key="id"> 5 <v-card class="card" elevation=20 slot="activator" @click="article.show"> 6 <v-img class="white--text align-end" height="200px" v-bind:src="article.image" alt=""> 7 <v-card-title class="title">{{ article.title }}</v-card-title> 8 </v-img> 9 <v-card-subtitle class="pb-0">{{ article.date }}</v-card-subtitle> 10 <v-card-text class="text--primary"> 11 <div class="name">{{ article.name }}</div> 12 <div>{{ article.place1 }}</div> 13 <div>{{ article.place2 }}</div> 14 </v-card-text> 15 </v-card> 16 </v-col> 17 </v-row> 18 19 <My-component ref="dialog1"></My-component> 20 </v-app> 21</template> 22 23<script> 24 import My-component from "./my-component"; 25 import axios from 'axios'; 26 export default { 27 name: "ArticleCard", 28 methods: { 29 show1() { 30 this.$refs.dialog1.open(); 31 }, 32 components: { 33 My-component 34 }, 35 data() { 36 return { 37 articles: [], 38 } 39 }, 40 mounted() { 41 axios 42 .get("http://127.0.0.1:8000/api/articles/") 43 .then(response => (this.articles = response.data)) 44 } 45 } 46</script> 47 48<style scoped> 49 .card { 50 max-width: 400px; 51 max-height: 320px; 52 margin: 0 auto; 53 ovarflow-y: hidden; 54 } 55 56 .title { 57 margin-bottom: -15px; 58 } 59 60 .name { 61 margin-bottom: 5px; 62 } 63</style> 64
[{"id":1,"show":"show1","image":"img/image1.jpeg","title":"\u90fd\u96fb\u8352\u5ddd\u7dda\u5b66\u7fd2\u9662\u4e0b\u99c5\u8e0f\u5207","date":"2019\u5e7411\u67081\u65e5","name":"\u30a2\u30cb\u30e1:\u51b4\u3048\u306a\u3044\u5f7c\u5973\u306e\u80b2\u3066\u304b\u305fOP","place1":"\u90fd\u96fb\u8352\u5ddd\u7dda\u5b66\u7fd2\u9662\u4e0b\u99c5\u3092\u964d\u308a\u3066\u3059\u3050\u306e\u8e0f\u5207","place2":null}]

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

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

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

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

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

guest

回答1

0

ベストアンサー

article.showにはあくまで文字列「show1」が入っているだけなので同名の関数を実行することはできません。
idと紐付いたダイアログコンポーネントを開きたい場合は以下のようにしてidを引数にして動作させる方法ではどうでしょうか。

vue

1<template> 2 <v-app> 3 <v-row justify="center" style="margin: 0" > 4 <v-col v-for="(article, id) in articles" :key="id"> 5 <v-card class="card" elevation=20 slot="activator" @click="show(article.id)"> 6      <!-- 中略 --> 7 </v-card> 8 </v-col> 9 </v-row> 10 11 <My-component ref="dialog1"></My-component> 12 </v-app> 13</template> 14 15<script> 16 import My-component from "./my-component"; 17 import axios from 'axios'; 18 export default { 19 name: "ArticleCard", 20 methods: { 21 show(id) { 22 this.$refs[`dialog${id}`].open(); 23 } 24 } 25 } 26</script>

投稿2019/11/26 06:29

nt4c

総合スコア768

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

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

退会済みユーザー

退会済みユーザー

2019/11/26 06:35

素早い解答本当に有難う御座います!!! 解決できました!!! 少し泣きそうです,,,
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問