Laravel8+Vuejs怎么实现单页面应用(SPA)

 2922

Laravel8+Vuejs怎么实现单页面应用?下面本篇文章介绍一下Laravel 8 配合 Vuejs 实现单页面应用(SPA)的方法,希望对大家有所帮助!


Laravel8+Vuejs怎么实现单页面应用(SPA)


我们都知道,Laravel 是一个很赞的框架!它允许全栈工程师们一站式构建前后端网站。因此,我们可以快速构建、交付高质量且安全的 web 项目。但它的强大不止于此。Laravel 还有很多事情可供探索发现。举个栗子,我们已经编写了一系列 Vue JS 的组件,这些组件可被嵌入到 Laravel 的页面中,动态的给用户提供 UI 交互。很有意思吧?但接下来我们需要探究的是,是否可以在 Laravel 项目中构建单页面应用(SPA)?当然可以,有何不可!

在一切开始之前,我们首先要知道为何我们的项目需要 SPA?不可否认,SPA 给予了用户更好的体验。它令页面加载更快,无需重载,哪怕用户没有网络也能访问网站!这些例子不胜枚举。当然,这也会带来一些缺点,在用前仍需三思。无论是构建 SPA 或者 MPA(多页面应用),都应确保其满足你的需求。不过 Laravel 默认使我们构建一个 MAP 项目,不是嘛?所以我认为是时候让我们探索下如何在 Laravel 项目中构建 SPA 了。正式启程!

内容概览

我们的目标

Laravel 及 Vue JS 的安装

Vue Router 以及文件结构

SPA 实现

1、我们的目标

在本文结束时我们需要构建出来一个什么来呢?很简单,我们将拥有一个内含两个页面的 SPA。如果我们点击其他页面,它将不会重载。下面看看项目最终效果。

Laravel8+Vuejs怎么实现单页面应用(SPA)

2、Laravel 及 Vue JS 的安装

我们将以全新的 Laravel 为起点。通常我们可以通过如下指令创建一个新项目:

  1. composer create-project laravel/laravel --prefer-dist laravel-vue-spa

创建完毕,已经拥有新项目了。随后需要在其中安装 Vue JS。

  1. composer require laravel/ui

最后需要做的是,把 Vue JS 整合进 Laravel 项目。感谢上苍,我们可以用如下指令帮助我们整合。非常之简单。

  1. php artisan ui vue

不要忘了在发生变化之时编译 Vue。

  1. npm install && npm run dev


3、Vue Router 以及文件结构

由于在 SPA 中,用户可以通过路由导航到他们想要抵达的页面。所以需要在其中安装一个附加库,Vue Router。

  1. npm install vue-router

实现 SPA 前最重要的步骤就是文件结构。在 resources/js 目录下创建新的文件夹及文件,代码结构如下图所示。


Laravel8+Vuejs怎么实现单页面应用(SPA)


在 resources/js 目录下,需要创建一个名为 layouts 的新目录,以及 pages 目录。layouts 目录所包含的内容如你所想,用于展示 pages 目录下页面的布局文件。疑惑么?这在随后实现 SPA 的过程中会让其结构更为清晰。

不要忘记创建 router.js 文件,用于存储我们所需的所有路由。


4、SPA 实现

是时候实现 SPA 了!首先,修改下 router.js 文件(在 resources/js/router.js)

  1. import Vue from 'vue';
  2. import VueRouter from 'vue-router';
  3.  
  4. import Home from './pages/Home.vue';
  5. import About from './pages/About.vue';
  6.  
  7. Vue.use(VueRouter);
  8.  
  9. const router = new VueRouter({
  10.     mode: 'history',
  11.     linkExactActiveClass: 'active',
  12.     routes: [
  13.         {
  14.             path: '/',
  15.             name: 'home',
  16.             component: Home
  17.         },
  18.         {
  19.             path: '/about',
  20.             name: 'about',
  21.             component: About
  22.         },
  23.     ]
  24. });
  25.  
  26. export default router;

在第四行和第五航,我们需要在这里配置两个页面,主页和关于页。我知道,目前还没有这两个页面。随后我们将会创建它们。在第 9-24 行,我们将注册需要的所有路由信息。因此每个路由对象都有 path,name 以及 component 属性用于渲染/展示。

已经把路由准备完毕了,现在要做什么呢?我们将在布局文件中展示这些页面。记得已经在 layouts 目录中的 App.vue 么?来创建它吧。

  1. <template>
  2.   <div>
  3.     <nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
  4.       <router-link :to="{ name: 'home' }" class="navbar-brand"
  5.         >Laravel-Vue SPA</router-link
  6.       >
  7.       <button
  8.         class="navbar-toggler"
  9.         data-toggle="collapse"
  10.         data-target="#navbarCollapse"
  11.       >
  12.         <span class="navbar-toggler-icon"></span>
  13.       </button>
  14.       <div id="navbarCollapse" class="collapse navbar-collapse">
  15.         <ul class="navbar-nav">
  16.           <li class="nav-item">
  17.             <router-link
  18.               class="nav-link"
  19.               data-toggle="collapse"
  20.               :to="{ name: 'home' }"
  21.             >
  22.               Home
  23.             </router-link>
  24.           </li>
  25.  
  26.           <li class="nav-item">
  27.             <router-link
  28.               class="nav-link"
  29.               data-toggle="collapse"
  30.               :to="{ name: 'about' }"
  31.             >
  32.               About
  33.             </router-link>
  34.           </li>
  35.         </ul>
  36.       </div>
  37.     </nav>
  38.  
  39.     <div class="container">
  40.       <router-view></router-view>
  41.     </div>
  42.   </div>
  43. </template>
  44.  
  45. <script>
  46. export default {
  47.   watch: {
  48.     $route() {
  49.       $("#navbarCollapse").collapse("hide");
  50.     },
  51.   },
  52. };
  53. </script>

注意 17-23 行,这里使用了 \ 标签。这个路由链接与 \ 标签很像,用于在多个页面中导航跳转。所以问题来了,页面会在哪里渲染呢?看 40行的 \ 标签,所以页面将会在 \ 标签处被渲染。

好了,还有首页和关于页面没有创建呢。打开 pages 目录下的 Home.vue 页面。

  1. <template>
  2.   <div class="container mt-5">
  3.     <div class="row justify-content-center">
  4.       <div class="col-md-8">
  5.         <div class="card">
  6.           <div class="card-header">About</div>
  7.  
  8.           <div class="card-body">About Page</div>
  9.         </div>
  10.       </div>
  11.     </div>
  12.   </div>
  13. </template>
  14.  
  15. <script>
  16. export default {
  17.  
  18. }
  19. </script>

直到这一步,我们才设置 SPA 页面间跳转的路由以及展示页面的布局。最后我们需要做的是,修改 Vue JS 的入口文件。

打开 resource/js/app.js 然后修改。

  1. /**
  2.  * 首先,我们将重载项目中所有包含 Vue 或其他库的 JavaScript 依赖
  3.  * 使用 Vue 和 Laravel 构建健壮、强大的 web 应用,这是个很好的开始。
  4.  */
  5.  
  6. require('./bootstrap');
  7.  
  8. window.Vue = require('vue').default;
  9.  
  10. import router from './router';
  11. import App from './layouts/App.vue';
  12.  
  13. /**
  14.  * 如下代码块可用于自动注册 Vue 组件。这将递归的扫描 Vue 组件目录
  15.  * 并按照其 "文件名" 自动注册。
  16.  *
  17.  * 比如 . ./components/ExampleComponent.vue -> <example-component></example-component>
  18.  */
  19.  
  20. // const files = require.context('./', true, /\.vue$/i)
  21. // files.keys().map(key => Vue.component(key.split('/').pop().split('.')[0], files(key).default))
  22.  
  23. Vue.component('example-component', require('./components/ExampleComponent.vue').default);
  24.  
  25. /**
  26.  * 随后,我们将创建一个新的 Vue 应用实例并将其挂载到页面。
  27.  * 然后,你可以附加组件到应用中或自定义 JavaScript 脚手架以满足特殊需求。
  28.  */
  29.  
  30. const app = new Vue({
  31.     router,
  32.     el: '#app',
  33.     render: h => h(App)
  34. });

在第 11 行和 12 行,引入了布局文件和路由文件,在 34 行,告诉 Vue 使用路由并在 36 行指定渲染到指定布局。

万事俱备,是时候告诉 Laravel 通过 Vuejs 实现 SPA 了。打开 routes/web.php 并在此创建其他入口。

  1. <?php
  2.  
  3. use Illuminate\Support\Facades\Route;
  4.  
  5. /*
  6. |--------------------------------------------------------------------------
  7. | Web 路由
  8. |--------------------------------------------------------------------------
  9. |
  10. | 这里是注册应用 web 路由的地方。这些路由将会被 RouteServiceProvider 加载
  11. | 也就是那些包含了 "web" 中间件的路由组会加载这些路由。
  12. | 现在继续创建一些有意思的东西!
  13. |
  14. */
  15.  
  16. Route::get('/{any}', function () {
  17.     return view('layouts.vue');
  18. })->where('any', '.*');

在如上代码中,我们告诉 Laravel 用户所有访问都将返回 resources/views/layouts/vue.blade.php 文件。很明显,我们还没有这个文件,一起创建下。

  1. <!DOCTYPE html>
  2. <html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
  3.  
  4. <head>
  5.     <meta charset="utf-8">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1">
  7.  
  8.     <title>Laravel</title>
  9.  
  10.     <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"
  11.         integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
  12. </head>
  13.  
  14. <body>
  15.  
  16.     <div id="app"></div>
  17.  
  18.     <script src="{{ asset('js/app.js') }}"></script>
  19. </body>
  20.  
  21. </html>

好了,这里有两个重点。第一个重点,在 16 行,创建了一个 id 为 “app” 的

标签。为何这很重要呢?因为 Vue 只能渲染到标致 id 为 “app” 的 div(或其他标签)上。如果你还记得 resources/js/app.js 的 35 行,我们告诉 Vue ,渲染到 id 为 “app” 的标签上。第二个重点是在 18 行,我们引入了编译后的 Vue JS 文件。

就先这样了。在你去测试前,请确保编译了 Vue JS 脚本:

  1. npm run dev

然后运行服务并在浏览器中打开。


Laravel8+Vuejs怎么实现单页面应用(SPA)

这!我们成功在 Laravel 中构建了 SPA!如果你从一个页面导航至另一个页面,将不会引发页面重载。

在本文完结前,我再说一点点,我们可以把 MPA 和 SPA 构建到一起。比如 SPA 页面只用于关于页。你需要为 SPA 添加一个端点 /about/{any} ,然后其他端点依旧是 MPA。或者哪怕项目中有多个 SPA 。通过 Laravel,也可以轻易的把其他 SPA 或者 MPA 或把他们一起构建到一个项目中!这不是就很赞吗!

是时候借宿了。在最后,我想说 Laravel 是一个非常棒的框架。你探索的越多,越能体验到它的强大。感谢您的阅读,我们下次见。


本文网址:https://www.zztuku.com/index.php/detail-12802.html
站长图库 - Laravel8+Vuejs怎么实现单页面应用(SPA)
申明:本文转载于《learnku》,如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐