将 Laravel 与 Vue js 集成

Posted

技术标签:

【中文标题】将 Laravel 与 Vue js 集成【英文标题】:Integrate Laraval with Vue js 【发布时间】:2021-12-16 20:21:10 【问题描述】:

我向您提出我的问题。我正在 Laravel 中开展一个项目,我最初将 Vue js 作为脚本集成到这样的刀片视图中,使用 CDN 导入 Vue。

<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script>
 var app = new Vue(
            el: '#app',
            data: 
                search: '',
                //other data .........
            ,
)

所有逻辑(方法和数据)都在刀片视图脚本中,我暂时不使用组件。在项目的开发中,我需要添加一个组件(Tiny mce - wysiwyg)。为此,我必须使用 Laravel Mix,才能将组件加载到视图中。

require('./bootstrap');
window.Vue = require('vue').default;
Vue.component('example-component', require('./components/ExampleComponent.vue').default);
Vue.component('tinymce', require('./components/Tinymce.vue').default);
const app = new Vue(
    el: '#app',
);

第一个问题 我问自己的第一个问题是:Vue 的两个实例,源文件 /resources/js/app.js 中的一个和刀片视图中的一个必须挂钩到相同的 html 元素,因此具有相同的 ID ?

el: '#app',

我无法将 Vue 实例从刀片文件移动到 app/js 文件中,因为它与 php 代码交织在一起。我必须保持两个不同的实例。一个用于加载组件,在本例中为 Tiny Mce,另一个用于在 Laravel 刀片视图中运行脚本。这两个实例的行为和交互方式如何?

第二个问题

另外我问自己的第二个问题是:我需要把Vue cdn到页面中,包括脚本

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

在 app.js 文件中导入 Vue,我无法在视图中通过 CDN 删除 Vie

【问题讨论】:

【参考方案1】:

两个 Vue 实例必须挂钩到同一个 HTML 元素,因此具有相同的 ID?

不,相反,我认为将两个不同的实例分配给同一个元素并不是一个好主意。如果两个实例开始相互干扰,您可能会有一些奇怪的行为。为实例使用两个单独的 HTML 根

是否需要将Vue cdn到页面中,包括脚本

没有。如果在编译的 js 中将 Vue 实例分配给 window 对象,则不再需要 CDN。请注意:您编译的 js 文件必须包含在刀片 vue 实例的 之前您的脚本标记中,没有 deferasync

<script src=" mix('js/yourfile.js') "></script>
// ^^^ this one before and without defer
// no vue included through CDN
<script>
  var app = new Vue(
    ....
  )
</script>

现在,让我们向房间里的大象讲话。在刀片文件中包含一个完整的 vue 实例是一种不好的做法,它可能会在一定程度上起作用,但是正如您在这种情况下所注意到的,它会成为一个问题。

我无法将 Vue 实例从刀片文件移动到 app/js 文件中,因为它与 php 代码交织在一起。

我可以想象 PHP 和 JS 代码相互交互的唯一方法是为了将一些数据从 PHP 传递到 JS。如果这是问题所在,这里有一个关于如何做到这一点的想法:

在你的blade文件中,将你想要与Js共享的数据结构附加到window对象上:

<script>
  window.sharedData = 
    key: @if($cond) 'value1' @else 'value2'
    ...
  
</script>

如果你有一个 PHP 对象想要直接共享,你可以使用@json 指令:

<script>
  window.sharedData = @json($sharedData);
</script>

现在,之后这个脚本标签可以包含混合文件:

<script src=" mix('js/yourfile.js') "></script>

在那里,您可以将 window.sharedData 对象与使用 PHP 代码构建的数据一起使用:

var app = new Vue(
    data: window.sharedData
  )

【讨论】:

以上是关于将 Laravel 与 Vue js 集成的主要内容,如果未能解决你的问题,请参考以下文章

你如何将 Vue.js 包(如 vodal)集成到 Laravel 中?

将 Typescript 与 Laravel 和 Vue.js 一起使用,导入不使其成为 Vue 组件?

我可以在 Laravel 中同时使用 OAuth 和 Auth 吗?

如何配置 laravel-mix 以便能够将 @material 与 vue.js 一起使用

将 Stylelint 与 Vue.js 集成

如何将 PHP smarty 模板与 Vue.js 集成?