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

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

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

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

3回答

2905閲覧

【Laravel6 + Vue.js】v-ifでモーダルを制御しようとしているが、常に表示されてしまう。

keimae

総合スコア11

Vue.js

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2020/11/09 01:38

編集2020/11/09 02:09

Laravel6とVue.jsで非同期のCRUDアプリの制作に取り組んでおります。
削除ボタンを押してモーダルの確認画面を表示させようと思っていますが、
常にモーダルが出現した状態になり、解決できず困っております。

イメージ説明

index.blade.php

blade

1 <table class="table justify-content-center text-nowrap table-striped" id="group"> 2 <tr> 3 <th>グループ名</th> 4 <th>所属数</th> 5 <th> </th> 6 </tr> 7 <tbody> 8 <tr v-for="(group, index) in groups" v-bind:key="index"> 9 <td>@{{ group.name }}</td> 10 <td> </td> 11 <td> 12 <div class="edit-delete"> 13 <form action="/group/edit/group.id" method="get"> 14 @csrf 15 <input type="submit" value="編集" class="mr-1 edit btn btn-info"> 16 </form> 17 <button class="delete btn btn-info" v-on:click="openModal">削除</button> 18 </div> 19 </td> 20 </tr> 21 </tbody> 22 <div v-if="showContent"> 23 <div id="overlay"> 24 <div id="content"> 25 <p>これがモーダルウィンドウです。</p> 26 <button v-on:click="closeModal">Close</button> 27 </div> 28 </div> 29 </div> 30 </table>

Vue

1new Vue({ 2 el: '#group', 3 data: { 4 showContent: false, 5 groups: [], 6 }, 7 methods: { 8 deleteRow: function(id,index){ 9 axios.post('http://192.168.56.101/api/group/delete/' + id) 10 .then(response => { 11 console.log(index) 12 this.groups.splice(index,1) 13 }) 14 }, 15 openModal: function(){ 16 console.log(showContent) 17 this.showContent = true 18 }, 19 closeModal: function(){ 20 this.showContent = false 21 } 22 }, 23 mounted () { 24 axios.get('http://192.168.56.101/api/group').then(response => { 25 console.log(response.data.groups); 26 this.groups = response.data.groups; 27 }) 28 } 29});

##試したこと
画面表示されているcloseボタンも効かないため、モーダル部分をコメントアウトして、削除ボタンを押すと下記エラーになります。
[Vue warn]: Error in v-on handler: "ReferenceError: showContent is not defined"

dataでshowContent: falseを定義していますが、これが定義されていないと見なされているため、v-if="showContent"でもモーダルが表示されてしまうようです。
この原因は何故でしょうか?

お知恵をお貸しいただければ幸いです。
よろしくお願い致します。

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

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

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

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

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

q_sane_q

2020/11/09 03:16

ReferenceErrorが出るのは console.log(showContent) でthisがついていないからではないでしょうか?
keimae

2020/11/09 04:08

ReferenceErrorが出る原因は仰る通り、thisが付いていないからでした。 ありがとうございます。
guest

回答3

0

自己解決

tableタグをdivタグで囲み、そのdivタグをid="group"とし、モーダルのコードをtableタグの外に書くことで、モーダルの制御ができるようになりました。

blade

1 <div class="table-responsive-sm" id="group"> 2 <table class="table justify-content-center text-nowrap table-striped" > 3 <tr> 4 <th>グループ名</th> 5 <th>所属数</th> 6 <th>aaa</th> 7 </tr> 8 <tbody> 9 <tr v-for="(group, index) in groups" v-bind:key="index"> 10 <td>@{{ group.name }}</td> 11 <td>@{{ group.members.length }}</td> 12 <td> 13 <div class="edit-delete"> 14 <form action="/group/edit/group.id" method="get"> 15 @csrf 16 <input type="submit" value="編集" class="mr-1 edit btn btn-info"> 17 </form> 18 <button class="delete btn btn-info" v-on:click="openModal">削除</button> 19 </div> 20 </td> 21 </tr> 22 </tbody> 23 </table> 24 <div v-if="showContent"> 25 <div id="overlay"> 26 <div id="content"> 27 <p>これがモーダルウィンドウです。</p> 28 <button v-on:click="closeModal">Close</button> 29 </div> 30 </div> 31 </div> 32 </div> 33

投稿2020/11/09 04:14

keimae

総合スコア11

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

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

0

まず回答の前提として、私はLaravelを一度も触ったことがなく知識の抜けや見当違いなところがある可能性があります。
その上で

vueの動作はとりあえずHTMLが書かれてから始まると思いま
す。
なので、v-ifでモーダル部分の表示を判定する前にまず表示されてしまって居るのだと思います。
(そのあたりのLaravelの動きはわかりません、すいません)
vueの表示判定を先行させるなら、ぱっと思いつくのはモーダルの部分をコンポーネント化し、コンポーネントのタグにv-ifをつけるというのはどうでしょうか。

投稿2020/11/09 03:27

編集2020/11/09 03:28
q_sane_q

総合スコア610

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

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

keimae

2020/11/09 04:17

コンポーネント化せずにやってみたいという思いがありました。 ReferenceErrorのご指摘ありがとうございました。
guest

0

dataは関数でなければいけないと思います。
これが原因かはわかりませんが、修正してみてください。

js

1data: function () { 2 return { 3 showContent: false, 4 groups: [], 5 } 6}

投稿2020/11/09 02:52

plasticgrammer

総合スコア629

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

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

keimae

2020/11/09 03:04

アドバイスいただいたコードに置き換えましたが、同様にモーダルが出てしまい変わりありませんでした。 引き続き自分でも原因を調査しています。
plasticgrammer

2020/11/09 03:13

thisを付けても同じでしょうか。 <div v-if="this.showContent">
keimae

2020/11/09 04:09

thisを付けましたが、変わりありませんでした。 何度もありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問