Vue组件未在laravel中显示

Posted

技术标签:

【中文标题】Vue组件未在laravel中显示【英文标题】:Vue component not showing in laravel 【发布时间】:2019-03-28 23:50:48 【问题描述】:

所以我尝试将我的 jquery 迁移到 vue 框架,我正在使用 laravel 5.6 和 webpack 来构建我的项目,但我的 vue 组件没有显示出来。

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

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

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

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

这是我的 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_containerwidth:100%; height:auto; display:flex; flex-direction:column;
.sidebar_related_titlewidth:100%; height:75px; font-size:16px; color:#454545; font-weight:600; display:flex; align-items:center;
.sidebar_related_content_containerwidth:100%; height:auto; display:flex; flex-direction:column; margin:15px 0px;
.sidebar_related_content_imagewidth: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_containerwidth:100%; height:30%; display:flex; flex-direction:column;
.sidebar_related_content_text_titlefont-size:15px; color:var(--main_color); font-weight:900; margin:5px 0px;
.sidebar_related_content_text_descriptionfont-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_containerwidth:100%; height:auto; padding-left:0px; padding-bottom:0px; padding-top:20px; position:relative;
.sidebar_stripe_whitewidth:15px; height:40px; background-color:white; position:absolute; top:0px; left:-10px; display:none;
.sidebar_related_containerwidth:100%; height:auto; display:flex; flex-direction:column; 
.sidebar_related_titlewidth:100%; height:auto; font-size:16px; color:#454545; font-weight:600; display:flex; align-items:center; margin:15px 0px;
.sidebar_related_content_containerwidth:100%; height:auto; display:flex; flex-direction:column; align-items:center; margin:15px 0px;
.sidebar_related_content_imagewidth: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_containerwidth:100%; height:20%; display:flex; flex-direction:column;
.sidebar_related_content_text_titlefont-size:15px; color:var(--main_color); font-weight:900; margin:5px 0px;
.sidebar_related_content_text_descriptionfont-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>

【问题讨论】:

如何在刀片中包含 app.js 和 app.css? 【参考方案1】:

您必须加载您的 /resources/js/app.js 文件。 把它放在你的&lt;head&gt;&lt;/head&gt; 标签中

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

【讨论】:

【参考方案2】:

有时你会重新安装 npm

npm install
npm run dev

这解决了我的问题。

【讨论】:

【参考方案3】:

:post="@json($classPost)" 是你的问题。 @json 不会转义输出以在 html 属性中使用,这就是为什么您在浏览器中的源屏幕截图中该行显示为亮红色 - 它是无效的(因为生成的 JSON 中的 " 字符,提前结束属性)。

这样就可以了:

:post=" json_encode($classPost) "

【讨论】:

【参考方案4】:

我认为您需要在&lt;/body&gt; 之前加载app.js,如下所示。

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

【讨论】:

可能 vue 正在加载,但您的相关帖子有一些问题。有控制台错误吗?

以上是关于Vue组件未在laravel中显示的主要内容,如果未能解决你的问题,请参考以下文章

vuejs 组件未在我的 laravel 5.3 刀片页面中呈现

未在 SFC 中定义的组件不使用 Vue3 Router 显示?

Vue 组件中的 Laravel CSRF 字段

为啥 vue js 组件没有显示在 laravel 刀片中?

Vue 组件未显示在我的 Laravel 刀片页面中

Vue2 / vue-router / Laravel - 路由器视图未显示 Vue 组件