Vue组件未在Laravel中显示

时间:2018-10-24 14:08:00

标签: javascript php laravel vue.js

因此,我尝试将jquery迁移到vue框架,我将laravel 5.6与webpack一起使用来构建项目,但我的vue组件未显示。

当我运行命令npm run dev时,我成功地构建了项目:

https://i.imgur.com/20OdT95.png

之后,我使用php artisan服务在浏览器中显示网络,但没有显示任何组件。

当我检查源代码时,这就是组件呈现的内容:

https://i.imgur.com/rtrIjuk.png

但是由于某种原因我看不到该组件?

这是我的app.js文件:

/**
 * First we will load all of this project's JavaScript dependencies which
 * includes Vue and other libraries. It is a great starting point when
 * building robust, powerful web applications using Vue and Laravel.
 */

/*
require('./bootstrap');
*/

window.Vue = require('vue');

/**
 * Next, we will create a fresh Vue application instance and attach it to
 * the page. Then, you may begin adding components to this application
 * or customize the JavaScript scaffolding to fit your unique needs.
 */

Vue.component('related-post-list', require('./components/RelatedPostList.vue'));
Vue.component('example-component', require('./components/ExampleComponent.vue'));

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

我的webpack文件:

let mix = require('laravel-mix');

/*
 |--------------------------------------------------------------------------
 | Mix Asset Management
 |--------------------------------------------------------------------------
 |
 | Mix provides a clean, fluent API for defining some Webpack build steps
 | for your Laravel application. By default, we are compiling the Sass
 | file for the application as well as bundling up all the JS files.
 |
 */

mix.js('resources/assets/js/app.js', 'public/js')
   .sass('resources/assets/sass/app.scss', 'public/css');

引导文件

window._ = require('lodash');
window.Popper = require('popper.js').default;

/**
 * We'll load jQuery and the Bootstrap jQuery plugin which provides support
 * for JavaScript based Bootstrap features such as modals and tabs. This
 * code may be modified to fit the specific needs of your application.
 */

try {
    window.$ = window.jQuery = require('jquery');

    require('bootstrap');
} catch (e) {}

/**
 * We'll load the axios HTTP library which allows us to easily issue requests
 * to our Laravel back-end. This library automatically handles sending the
 * CSRF token as a header based on the value of the "XSRF" token cookie.
 */

window.axios = require('axios');

window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

/**
 * Next we will register the CSRF Token as a common header with Axios so that
 * all outgoing HTTP requests automatically have it attached. This is just
 * a simple convenience so we don't have to attach every token manually.
 */

let token = document.head.querySelector('meta[name="csrf-token"]');

let ajaxEncoding = 'multipart/form-data';
console.log("'Ajax encoding is ${ajaxEncoding}'");

axios.defaults.headers.post['Content-Type'] = ajaxEncoding;

if (token) {
    window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
    console.log('CSRF token found');
} else {
    console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
}

/**
 * Echo exposes an expressive API for subscribing to channels and listening
 * for events that are broadcast by Laravel. Echo and event broadcasting
 * allows your team to easily build robust real-time web applications.
 */

// import Echo from 'laravel-echo'

// window.Pusher = require('pusher-js');

// window.Echo = new Echo({
//     broadcaster: 'pusher',
//     key: process.env.MIX_PUSHER_APP_KEY,
//     cluster: process.env.MIX_PUSHER_APP_CLUSTER,
//     encrypted: true
// });

我的组件

<template>
<div class="sidebar_related_container" style="">
	<span class="sidebar_related_title" style="">Temas Relacionados</span>
	<div class="sidebar_related_content_container" v-for="post in relatedPosts" :key="post.id" style="">
		<a class="sidebar_related_content_image" :href="'/conducta-canina/${post.slug}'"  :style="'background-image:url(${post.slug});'">
			<div class="black_gradient" style=""></div>
		</a>
		<div class="sidebar_related_content_text_container" style="">
		    <span class="sidebar_related_content_text_title" style="">{{ post.postcategory.name }}</span>
		    <span class="sidebar_related_content_text_description" style="">{{ post.title }}</span>
	    </div>
	</div>
</div>
</template>
<!--SCRIPTS-->
<script>
export default
{
name: 'RelatedPostList',
    
props: {
    post: {required:true}
},

data: function () {
    return {

        relatedPosts: null,
        id: this.post.id,
        category : this.post.postcategory.name

    }
},

mounted () {

    console.log("'${this.$options.name} component succesfully mounted'");

    axios.post("/posts/related", this.id, this.category)
        .then(response => (this.relatedPosts = response.data.relatedPosts))
        .catch(error => console.log(error));
},

methods: {

},


}
</script>
<!--STYLES-->
<style scoped>
.sidebar_related_container{width:100%; height:auto; display:flex; flex-direction:column;}
.sidebar_related_title{width:100%; height:75px; font-size:16px; color:#454545; font-weight:600; display:flex; align-items:center;}
.sidebar_related_content_container{width:100%; height:auto; display:flex; flex-direction:column; margin:15px 0px;}
.sidebar_related_content_image{width:100%; height:180px; box-shadow:2px 2px 2px rgba(0,0,0,0.2); position:relative; background-size:cover; margin-bottom:3px;}
.sidebar_related_content_text_container{width:100%; height:30%; display:flex; flex-direction:column;}
.sidebar_related_content_text_title{font-size:15px; color:var(--main_color); font-weight:900; margin:5px 0px;}
.sidebar_related_content_text_description{font-size:13px; color:rgba(0,0,0,0.7); font-weight:500; margin:5px 0px; line-height:20px;}
@media only screen and (max-width: 736px) 
{
.sidebar_container{width:100%; height:auto; padding-left:0px; padding-bottom:0px; padding-top:20px; position:relative;}
.sidebar_stripe_white{width:15px; height:40px; background-color:white; position:absolute; top:0px; left:-10px; display:none;}
.sidebar_related_container{width:100%; height:auto; display:flex; flex-direction:column; }
.sidebar_related_title{width:100%; height:auto; font-size:16px; color:#454545; font-weight:600; display:flex; align-items:center; margin:15px 0px;}
.sidebar_related_content_container{width:100%; height:auto; display:flex; flex-direction:column; align-items:center; margin:15px 0px;}
.sidebar_related_content_image{width:100%; height:155px; box-shadow:2px 2px 2px rgba(0,0,0,0.2); position:relative; background-size:cover; margin-bottom:3px;}
.sidebar_related_content_text_container{width:100%; height:20%; display:flex; flex-direction:column;}
.sidebar_related_content_text_title{font-size:15px; color:var(--main_color); font-weight:900; margin:5px 0px;}
.sidebar_related_content_text_description{font-size:13px; color:rgba(0,0,0,0.7); font-weight:500; margin:5px 0px; line-height:20px;}
}
</style>

还有我的刀片模板:

<div class="sidebar_container" style="">
	    <div class="sidebar_stripe_white" style=""></div>
		<related-post-list :post="@json($classPost)"></related-post-list>
		<!--<example-component></example-component>-->
		<!--@include('partials/sidebar/contact_form')-->
	</div>

此文件位于我的主布局内,其中body标签具有“ app”标识符:

<body id="app" class="">
  //sidebar
</body>

4 个答案:

答案 0 :(得分:1)

您必须加载/resources/js/app.js文件。 将其放在您的<head></head>标签内

<script src="{{ asset('js/app.js') }}" defer></script>

答案 1 :(得分:0)

我认为您需要在app.js之前加载</body>,如下所示。

<body id="app" class="">
  //sidebar
  <script src=" {{ mix('js/app.js') }} "></script>
</body>

答案 2 :(得分:0)

:post="@json($classPost)"是您的问题。 @json不会转义HTML属性中使用的输出,这就是为什么您在浏览器中的源屏幕截图的那一行显示为鲜红色-这是无效的(由于"中的字符结果JSON,该属性过早地结束了该属性。)

这可以解决问题:

:post="{{ json_encode($classPost) }}"

答案 3 :(得分:-1)

有时您需要重新安装npm

npm install
npm run dev

那解决了我的问题。