\r\n@endsection\r\n\r\n```\r\n\r\n### エラーメッセージ\r\n```\r\nUncaught ReferenceError: Vue is not defined\r\n```\r\n\r\n\r\n### 補足情報(FW/ツールのバージョンなど)\r\nLaravel: 5.5\r\nVue.js: 2.5.7\r\n\r\n```\r\nnpm install\r\n```\r\nによりvue.jsが入っていることは確認しています.\r\n\r\nどのように修正すればいいでしょうか?","answerCount":1,"upvoteCount":0,"datePublished":"2018-05-22T09:52:28.472Z","dateModified":"2022-01-12T10:55:45.698Z","suggestedAnswer":[{"@type":"Answer","text":"少なくともBladeファイル内で使う場合は``js/app.js``を読み込んでいる箇所より後にスクリプトを書く必要があります。(厳密には``window.Vue = require('vue');``より後)\r\n\r\n基本的にはスクリプトをビューに書かずに``resources/assets/js/app.js`` の例にあるようにコンポーネントの形で追加し、Webpack を使ってコンパイルを行うことになると思います。\r\n\r\nLaravel には最初から example-component が登録されているのでビューの何処かに```` と書けば文字が表示されるので試してみると流れがつかみやすいかもしれません。\r\n\r\n【resources/assets/js/app.js の抜粋】\r\n\r\n```javascript\r\nVue.component('example-component', require('./components/ExampleComponent.vue'));\r\n\r\nconst app = new Vue({\r\n el: '#app'\r\n});\r\n```\r\n\r\n[https://laravel.com/docs/5.5/mix](https://laravel.com/docs/5.5/mix)","dateModified":"2018-05-22T10:14:51.982Z","datePublished":"2018-05-22T10:11:37.810Z","upvoteCount":0,"url":"https://teratail.com/questions/127422#reply-193872","comment":[{"@type":"Comment","text":"基本的にはスクリプトをビューに書かないと言うことですが,jQueryのようにscriptタグの中からhtmlエレメントを操作するということはしないのですか?\r\n\r\nまた,例えば2つのbladeファイルがあり,それぞれに別々のコンポーネントを表示したい場合は,jsファイルを2つ作成して,その作成したファイルをwebpack.mix.jsに追加するという形ですか?","datePublished":"2018-05-22T10:41:27.321Z","dateModified":"2018-05-22T10:41:27.321Z"},{"@type":"Comment","text":"Vueは文法的に新しい書き方がされているため古いブラウザでは正常に動作しないことがあります。そのため、Webpackの中で使われているBabelを通して古いブラウザにも対応する形に変換するのが一般的です。\r\nビュー内のscriptタグ内に直接書いたVue関係のスクリプトは最新のブラウザでしか処理できない可能性があるため避けたほうが良いと思います。jQueryなどレガシーブラウザにも対応しているものに関してはビュー内に直接書いてしまっても問題は起きにくいです。webpack.mix.js に追加するよりも resources/assets/js/app.js に require() などを使って読み込ませるほうが1つのファイルに纏められて良いと思います。","datePublished":"2018-05-22T10:58:59.093Z","dateModified":"2018-05-22T10:58:59.093Z"},{"@type":"Comment","text":"なるほど......\r\n\r\nそれではlaravel + vue.jsで開発する時には,SPA的にコントローラーからAPI経由でデータをvue.jsに渡すのが一般的と言うことですか?\r\n今はコントローラーからbladeに渡して,それをVue.jsで扱えたらいいなと思っているんですが....\r\n\r\n\r\nresources/assets/js/app.jsにまとめられると言う部分がいまいちわからないです....\r\n\r\n例えばApp.blade.php と Hoge.blade.phpという2つのファイルがあったとして,それぞれ\r\nApp.blade.php\r\n```\r\n
\r\n \r\n
\r\n\r\n```\r\n\r\nHoge.blade.php\r\n```\r\n
\r\n \r\n
\r\n\r\n```\r\n\r\nという内容だった時に,resources/assets/js/app.jsに\r\n```\r\nrequire('./bootstrap.js');\r\n\r\nwindow.Vue = require('vue');\r\n\r\nconst app = new Vue{(\r\n el: '#app',\r\n)};\r\n\r\nconst hoge = new Vue{(\r\n el: '#hoge'\r\n)};\r\n```\r\n\r\nとすれば別々にマウントすることができるということですか?\r\n長くなってしまいすみません...","datePublished":"2018-05-22T11:15:24.517Z","dateModified":"2018-05-22T11:15:24.517Z"},{"@type":"Comment","text":"Vue.jsの強みを最大限に利用するならaxios等と組み合わせてAPIから情報を取得する形になると思います。\r\n\r\n小規模なものであれば提示していただいたコードのように「el」をページごとに変えることでも実現できると思いますが、app.js の肥大化に注意が必要です。可能ならコンポーネント(https://jp.vuejs.org/v2/guide/single-file-components.html)の利用も検討してみて下さい。\r\n上記コードではコンポーネントを使っていないため の箇所は不要となっています。\r\nコンポーネントを利用する場合は「el」を変えずに Vue.component() でコンポーネントを登録し、使用したい箇所に などのタグを挿入します。","datePublished":"2018-05-23T01:25:45.901Z","dateModified":"2018-05-23T01:25:45.901Z"}]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https://teratail.com","name":"トップ"}},{"@type":"ListItem","position":2,"item":{"@id":"https://teratail.com/tags/Vue.js","name":"Vue.jsに関する質問"}},{"@type":"ListItem","position":3,"item":{"@id":"https://teratail.com/questions/127422","name":"Laravel + Vue.js の併用の仕方について"}}]}}}
質問するログイン新規登録

Q&A

1回答

1471閲覧

Laravel + Vue.js の併用の仕方について

arw.tyx-out_mz

総合スコア27

Vue.js

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

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2018/05/22 09:52

0

1

やりたいこと

Laravel5.5とVue.jsを使用してアプリケーションを作成しています.
LaravelのBladeファイルの中でVue.jsを使うやり方がわからないので質問させていただきます..

該当のソースコード

blade.php

1// news.blade.php 2 3@section('content') 4 <div id="news"> 5 <button v-on:click="test">Test</button> 6 </div> 7 8 <script> 9 var news = new Vue({ 10 el: '#news', 11 methods: { 12 test: function () { 13 console.log("Hello World!"); 14 } 15 } 16 }) 17 </script> 18@endsection 19

エラーメッセージ

Uncaught ReferenceError: Vue is not defined

補足情報(FW/ツールのバージョンなど)

Laravel: 5.5
Vue.js: 2.5.7

npm install

によりvue.jsが入っていることは確認しています.

どのように修正すればいいでしょうか?

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

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

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

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

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

guest

回答1

0

少なくともBladeファイル内で使う場合はjs/app.jsを読み込んでいる箇所より後にスクリプトを書く必要があります。(厳密にはwindow.Vue = require('vue');より後)

基本的にはスクリプトをビューに書かずにresources/assets/js/app.js の例にあるようにコンポーネントの形で追加し、Webpack を使ってコンパイルを行うことになると思います。

Laravel には最初から example-component が登録されているのでビューの何処かに<example-component></example-component> と書けば文字が表示されるので試してみると流れがつかみやすいかもしれません。

【resources/assets/js/app.js の抜粋】

javascript

1Vue.component('example-component', require('./components/ExampleComponent.vue')); 2 3const app = new Vue({ 4 el: '#app' 5});

https://laravel.com/docs/5.5/mix

投稿2018/05/22 10:11

編集2018/05/22 10:14
workr

総合スコア158

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

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

arw.tyx-out_mz

2018/05/22 10:41

基本的にはスクリプトをビューに書かないと言うことですが,jQueryのようにscriptタグの中からhtmlエレメントを操作するということはしないのですか? また,例えば2つのbladeファイルがあり,それぞれに別々のコンポーネントを表示したい場合は,jsファイルを2つ作成して,その作成したファイルをwebpack.mix.jsに追加するという形ですか?
workr

2018/05/22 10:58

Vueは文法的に新しい書き方がされているため古いブラウザでは正常に動作しないことがあります。そのため、Webpackの中で使われているBabelを通して古いブラウザにも対応する形に変換するのが一般的です。 ビュー内のscriptタグ内に直接書いたVue関係のスクリプトは最新のブラウザでしか処理できない可能性があるため避けたほうが良いと思います。jQueryなどレガシーブラウザにも対応しているものに関してはビュー内に直接書いてしまっても問題は起きにくいです。webpack.mix.js に追加するよりも resources/assets/js/app.js に require() などを使って読み込ませるほうが1つのファイルに纏められて良いと思います。
arw.tyx-out_mz

2018/05/22 11:15

なるほど...... それではlaravel + vue.jsで開発する時には,SPA的にコントローラーからAPI経由でデータをvue.jsに渡すのが一般的と言うことですか? 今はコントローラーからbladeに渡して,それをVue.jsで扱えたらいいなと思っているんですが.... resources/assets/js/app.jsにまとめられると言う部分がいまいちわからないです.... 例えばApp.blade.php と Hoge.blade.phpという2つのファイルがあったとして,それぞれ App.blade.php ``` <div id="app"> <app></app> </div> <script src="{{ mix('js/app.js') }}"></script> ``` Hoge.blade.php ``` <div id="hoge"> <hoge></hoge> </div> <script src="{{ mix('js/app.js') }}"></script> ``` という内容だった時に,resources/assets/js/app.jsに ``` require('./bootstrap.js'); window.Vue = require('vue'); const app = new Vue{( el: '#app', )}; const hoge = new Vue{( el: '#hoge' )}; ``` とすれば別々にマウントすることができるということですか? 長くなってしまいすみません...
workr

2018/05/23 01:25

Vue.jsの強みを最大限に利用するならaxios等と組み合わせてAPIから情報を取得する形になると思います。 小規模なものであれば提示していただいたコードのように「el」をページごとに変えることでも実現できると思いますが、app.js の肥大化に注意が必要です。可能ならコンポーネント(https://jp.vuejs.org/v2/guide/single-file-components.html)の利用も検討してみて下さい。 上記コードではコンポーネントを使っていないため <hoge></hoge> の箇所は不要となっています。 コンポーネントを利用する場合は「el」を変えずに Vue.component() でコンポーネントを登録し、使用したい箇所に <my-component></my-component> などのタグを挿入します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問