什么是 Vue.js
Vue.js(下文简称 Vue)是一款用于构建用户界面的渐进式 JavaScript 框架。“渐进式”指可以从很小的部分开始逐步加入更多能力,既能嵌入到已有 HTML 页面里,也能撑起一个大规模 SPA。 Vue 的核心是响应式(reactivity)。数据变化时 DOM 会自动更新,开发者不用手动管理“什么时候、更新哪个元素”。本文讲解的是 Vue 3 与 Inertia v3 的组合。Laravel 13 的启动套件默认使用这一组合。
Options API 与 Composition API
Vue 3 提供两种编写组件的风格:Options API 和 Composition API。 Options API 是 Vue 2 一路沿用下来的传统风格,通过data、methods、computed、mounted 等选项对象来定义组件。
<script setup> 语法后,可以写得更简洁。逻辑复用性更好,与 TypeScript 也更契合。
在 Laravel 中的定位
历史
Vue 与 Laravel 的渊源很深,始于 Laravel 5.3(2016 年),当时 Vue 被选为默认的前端框架。那时的package.json 就包含了 Vue,并附带示例组件 resources/js/components/ExampleComponent.vue。
Laravel 6(2019 年) 把认证脚手架剥离到 laravel/ui 包,Vue 脚手架也随之搬到了这个包里。现在的主流方式,是通过 laravel new 的启动套件选择 Inertia + Vue。
对 Laravel 用户来说,Vue 是最熟悉的 JS 框架,中文学习资料也很丰富。
当前主流:Inertia × Vue
当前 Laravel 中使用 Vue 的主流方式就是 Inertia × Vue。Inertia 让你无需设计 API,就能直接从 Laravel 控制器把数据传给 Vue 组件,实现“现代单体”架构。搭建
通过启动套件(推荐)
新项目最省事的方法就是使用启动套件。inertiajs/inertia-laravel(服务端适配器)@inertiajs/vue3(客户端适配器)vue(Vue 3 本体)@vitejs/plugin-vue(Vite 插件)HandleInertiaRequests中间件- 登录 / 注册等认证页面(已用 Inertia + Vue 实现)
手动安装
在已有项目中引入时,分别安装服务端和客户端。vite.config.js 里加上 Vue 插件。
resources/js/app.js 里启动 Inertia 应用。
手动安装的详细步骤(根模板设置、中间件注册等)请参考 Inertia 官方文档。
目录结构
启动套件把 Vue 页面组件放在resources/js/pages/ 目录下。
Inertia::render('Posts/Index', [...]) 时对应的就是 resources/js/pages/Posts/Index.vue。
Vue 模板语法
读懂和编写启动套件代码所需的基本模板指令。{{ }} —— 变量展开
用双大括号把 JavaScript 值或表达式嵌入模板。
v-if —— 条件分支
{#if} 或 React 中的三元运算符。
v-for —— 列表渲染
:key。相当于 React 的 Array.map()。
v-model —— 双向绑定
v-model 可以把表单元素和响应式变量双向同步。
:(v-bind)与 @(v-on)
:attr="value"—— 给 HTML 属性做动态绑定(v-bind:attr的简写)@event="handler"—— 注册事件监听器(v-on:event的简写)
页面组件基础
Inertia 的页面组件就是普通的 Vue 组件。从 Laravel 控制器传来的数据会作为 props 接收。控制器
Vue 页面组件
defineProps() 声明 props,就能在模板中使用从控制器传来的数据。无需定义 REST API。
Link 组件
使用 @inertiajs/vue3 提供的 <Link> 组件,页面跳转通过 XHR 完成,避免整页重载。
<a> 一样,但幕后 Inertia 只替换页面组件,体验接近 SPA。
Form 组件
@inertiajs/vue3 提供的 <Form> 组件是启动套件认证页面推荐的表单提交样式。通过 props 指定 action 和 method,再用 v-slot 访问 errors 和 processing。
基本用法
v-slot="{ errors, processing }" 是 Vue 的作用域插槽语法,Form 组件会自动算出这些值并传入。表单字段用 HTML 原生的 name 属性而不是 v-model,让浏览器的标准表单数据采集照常工作。
启动套件的模式
启动套件通过 Wayfinder 把路由作为对象管理。store.form() 返回包含路由对象 action 与 method 的对象,用 v-bind 展开到 <Form>。
reset-on-success 中列出的字段会在提交成功后自动重置。密码等提交完希望清空的字段可以列在这里。
不用 Wayfinder 时,直接传
action="/login" 就能达到同样效果。useForm helper
表单处理使用 @inertiajs/vue3 的 useForm helper,可以简洁实现表单状态管理、提交、校验错误显示。
控制器侧
Vue 表单组件
useForm 返回对象的主要属性:
校验返回错误时,
useForm 会保留已输入内容并显示错误。配合 v-model 可以实现顺滑的表单体验。
共享数据(Shared Data)
所有页面共用的数据(登录中的用户信息、闪存消息等)可以在HandleInertiaRequests 中间件的 share() 方法中定义。
usePage() 访问共享数据。
共享数据会包含在每一次请求中,建议只保留必要的最少数据。用
fn() 做惰性求值时,只有真正访问时才求值。Vue 3 响应式基础
Inertia × Vue 开发中你需要了解的 Vue 3 响应式 API。ref —— 基础类型的响应式值
computed —— 计算属性
onMounted —— 挂载后的处理
总结
Vue.js 与 Laravel 兼容性很高,特别是通过 Inertia 采用“现代单体”结构时会充分发挥它的价值。
用 Inertia × Vue,你可以同时享受到 Laravel 后端的简洁和 Vue 的响应式 UI。用启动套件创建项目后,连认证页面都是现成的,可以立即开始开发。
Inertia.js 官方文档
Inertia v3 的完整功能请参考官方文档。