Laravel + Vue.js MPA/SPA 混合结构的建议和思考

Posted

技术标签:

【中文标题】Laravel + Vue.js MPA/SPA 混合结构的建议和思考【英文标题】:Laravel + Vue.js MPA/SPA hybrid structure suggestions and thoughts 【发布时间】:2019-02-19 14:47:27 【问题描述】:

我想到了以下 MPA - SPA 混合,我基本上将每个页面视为一个 SPA,但仍然像习惯性一样重新加载页面以从一个页面过渡到另一个页面(index.blade.php 到 posts.blade.php) MPA。此方法使用 laravel 路由、会话和身份验证的强大功能来渲染包含单个 vue.js 组件的刀片模板。

想象一下你在主页,你会看到这样的东西:

@extends('layouts.master')
@section('content')
<body id="vue_root">
    <page-index data= json encoded data from backend ></page-index>
</body>
@endsection

如你所见,我将一个 json 对象作为一个 prop 传递给 vue 组件,这个 prop 包含 vue 渲染所需的所有数据。

当使用这种将每个页面视为一个组件的方法时,我可以使用 vue.js 单个文件将所有标记、逻辑(vue 组件方法和样式)包含在一个文件中,这将使我更容易测试和调试。

我有一个 vue.js 根实例,我在其中注册了所有页面组件。

但是,由于我使用 laravel 控制器作为后端来检索所有数据以及刀片视图,因此我还必须创建 vue.js 组件和 laravel 刀片模板,这对我来说听起来像是双重工作。

您如何看待这种模式?好吗?任何改进这一点的想法,我是否应该使用 inline-templates 代替(这样我就不需要制作相应的刀片模板和 vue.js 页面组件。

【问题讨论】:

【参考方案1】:

使用水疗模式。

在 spa 中只加载一次 index.blade.php 文件然后加载 .vue 文件

那么例子:这是你的 index.blade.php 文件

@extends('layouts.master')
@section('content')
<body id="vue_root">
    <vue-router></vue-router>
</body>
@endsection

这是您的 hotel.vue 文件,其中

   list,add,edit,delete functionality 

这是你的 room.vue 文件

  book room,check room available ,etc. functionality.

现在,如果您单击酒店链接,则只需加载带有其功能的 hotel.vue 文件 并将ajax请求发送到服务器(hotelcontroller)并获取带有json响应的酒店列表..(不重新加载整个只是重新加载元素)

如果你点击房间链接,那么只加载 room.vue 文件和他的 功能和加载室依赖性..(不重新加载整个只是重新加载 元素)

在vue中使用vue-router你可以这样做......

有关更多详细信息,请参阅此link 和此link

【讨论】:

以上是关于Laravel + Vue.js MPA/SPA 混合结构的建议和思考的主要内容,如果未能解决你的问题,请参考以下文章

子域 Laravel 路由和 Vue.js

Vue.js / Laravel - 正确处理注销

Laravel 和 Vue.js 看不到 css 和 js 文件

Laravel、刀片、vue.js 和 @if (@ )

为啥 Laravel 中间件 CORS 不能与 Vue.js 一起使用

laravel 中的 Vue.js 错误