laravel Vue.js 2.0 无法编译模板

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/40849885/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 14:50:12  来源:igfitidea点击:

Vue.js 2.0 failed to compile template

phplaravelvue.js

提问by Jenssen

I use webpack, vue.js 2.0and Laravel 5.3. Nothing goes wrong when I compile with gulp.

我使用webpack,vue.js 2.0Laravel 5.3. 当我用 gulp 编译时没有任何问题。

But I get this error in the consolewhen I go to /homethat links to home.blade.php.

但我得到的这个错误console,当我去到/home那个链接home.blade.php

Error:

错误

vue.js?3de6:515 [Vue warn]: failed to compile template:

//my component

(found in root instance) 

app.js

应用程序.js

require('./bootstrap');


Vue.component('CheckoutForm', require('./components/CheckoutForm.vue'));

const app = new Vue({
    el: '#app'
});

app.blade.php

应用程序.blade.php

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- CSRF Token -->
    <meta name="csrf-token" content="{{ csrf_token() }}">

    <title>{{ config('app.name', 'Laravel') }}</title>

    <!-- Styles -->
    <link href="/css/app.css" rel="stylesheet">

    <!-- Scripts -->
    <script>
        window.lnj = <?php echo json_encode([
            'csrfToken' => csrf_token(),
            'stripeKey' => config('services.stripe.key')
        ]); ?>
    </script>
</head>
<body>
    <div id="app">
        <nav class="navbar navbar-default navbar-static-top">
            <div class="container">
                <div class="navbar-header">

                    <!-- Collapsed Hamburger -->
                    <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#app-navbar-collapse">
                        <span class="sr-only">Toggle Navigation</span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                    </button>

                    <!-- Branding Image -->
                    <a class="navbar-brand" href="{{ url('/') }}">
                        {{ config('app.name', 'Laravel') }}
                    </a>
                </div>

                <div class="collapse navbar-collapse" id="app-navbar-collapse">
                    <!-- Left Side Of Navbar -->
                    <ul class="nav navbar-nav">

                    </ul>

                    <!-- Right Side Of Navbar -->
                    <ul class="nav navbar-nav navbar-right">
                        <!-- Authentication Links -->
                        @if (Auth::guest())
                            <li><a href="{{ url('/login') }}">Login</a></li>
                            <li><a href="{{ url('/register') }}">Register</a></li>
                        @else
                            <li class="dropdown">
                                <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
                                    {{ Auth::user()->name }} <span class="caret"></span>
                                </a>

                                <ul class="dropdown-menu" role="menu">
                                    <li>
                                        <a href="{{ url('/logout') }}"
                                            onclick="event.preventDefault();
                                                     document.getElementById('logout-form').submit();">
                                            Logout
                                        </a>

                                        <form id="logout-form" action="{{ url('/logout') }}" method="POST" style="display: none;">
                                            {{ csrf_field() }}
                                        </form>
                                    </li>
                                </ul>
                            </li>
                        @endif
                    </ul>
                </div>
            </div>
        </nav>

        @yield('content')
    </div>

    <!-- Scripts -->
    <script src="https://checkout.stripe.com/checkout.js"></script>
    <script src="/js/app.js"></script>
</body>
</html>

home.blade.php

主页.blade.php

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <div class="panel panel-default">
                <div class="panel-heading">Dashboard</div>

                <div class="panel-body">
                    <checkout-form :plans="{{ $plans }}"></checkout-form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

package.json

包.json

{
  "private": true,
  "scripts": {
    "prod": "gulp --production",
    "dev": "gulp watch"
  },
  "devDependencies": {
    "bootstrap-sass": "^3.3.7",
    "gulp": "^3.9.1",
    "jquery": "^3.1.0",
    "laravel-elixir": "^6.0.0-14",
    "laravel-elixir-vue-2": "^0.2.0",
    "laravel-elixir-webpack-official": "^1.0.2",
    "lodash": "^4.16.2",
    "vue": "^2.0.1",
    "vue-resource": "^1.0.3"
  }
}

checkoutForm.js (component)

checkoutForm.js(组件)

<template>
    <form action="/subscriptions" method="POST">
        <select name="plans" v-model="plan">
            <option v-for="plan in plans" :value="plan.id">
                {{ plan.plan }} &mdash; {{ plan.price / 100 }}
            </option>
        </select>

        <button type="submit" @click.prevent="subscribe">Koop het hier!</button>

        <p v-show="status" v-text="status"></p>
    </form>
</template>

<script>
    export default {
        props: ['plans'],

        data() {
            return {
                stripeEmail: '',
                stripeToken: '',
                status: false,
                plan: 1
            };
        },

        created() {
            this.stripe = StripeCheckout.configure({
                key: lnj.stripeKey,
                locale: "auto",
                panelLabel: "Subscribe For",
                token: (token) => {
                    this.stripeToken = token.id;
                    this.stripeEmail = token.email;

                    this.$http.post('/subscriptions', this.$data)
                            .then(
                                response => alert("Success!"),
                                response => this.status = response.body.status
                            );
                }
            });
        },

        methods: {
            subscribe() {
                let plan = this.findPlanById(this.plan);
                this.stripe.open({
                        'Name': plan.name,
                        'description': plan.description,
                        'zipCode': true,
                        'currency': "eur",
                        'amount': plan.price
                });
            },

            findPlanById(id) {
                return this.plans.find(plan => plan.id == id);
            }
        }
    }
</script>

What could be the problem?

可能是什么问题呢?

采纳答案by GuyC

First ensure you haven't named your component checkoutForm.jswhen it should be checkoutForm.vueotherwise webpack will use the incorrect loaders.

首先确保你没有checkoutForm.js在应该命名你的组件时命名,checkoutForm.vue否则 webpack 将使用不正确的加载器。

Within your main app.jsyou need to rename your component to lowercase hyphenated:

在您的主app.js 中,您需要将组件重命名为小写连字符:

Vue.component('checkout-form' ...

Then you are setting this.stripeto an instance of StripeCheckout

然后你设置this.stripe为一个实例StripeCheckout

instead you should:

相反,您应该:

checkoutForm.js

结帐表格.js

data() {
   return {
      stripeEmail: '',
      stripeToken: '',
      status: false,
      plan: 1
   };
},

stripe: null,

created() {
   this.$options.stripe = StripeCheckout.configure({
   ...

Then always reference this.$options.stripeotherwise Vue will try and make stripereactive

然后总是引用,this.$options.stripe否则 Vue 将尝试使stripe响应式

回答by Jetmir Haxhisefa

Make sure that the $plans is set (is not null) in your home.blade.php

确保 $plans 在您的 home.blade.php 中设置(不为空)