跳转到主要内容

什么是 Vue.js

Vue.js(下文简称 Vue)是一款用于构建用户界面的渐进式 JavaScript 框架。“渐进式”指可以从很小的部分开始逐步加入更多能力,既能嵌入到已有 HTML 页面里,也能撑起一个大规模 SPA。 Vue 的核心是响应式(reactivity)。数据变化时 DOM 会自动更新,开发者不用手动管理“什么时候、更新哪个元素”。
本文讲解的是 Vue 3 与 Inertia v3 的组合。Laravel 13 的启动套件默认使用这一组合。

Options API 与 Composition API

Vue 3 提供两种编写组件的风格:Options APIComposition API Options API 是 Vue 2 一路沿用下来的传统风格,通过 datamethodscomputedmounted 等选项对象来定义组件。
Composition API 是 Vue 3 引入的新风格。搭配 <script setup> 语法后,可以写得更简洁。逻辑复用性更好,与 TypeScript 也更契合。
在 Inertia × Laravel 的启动套件里,使用 <script setup> 的 Composition API 风格是标准。本文示例也都用 <script setup>

在 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 组件,实现“现代单体”架构。

搭建

通过启动套件(推荐)

新项目最省事的方法就是使用启动套件。
在交互式提示中选择 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 —— 条件分支

相当于 Svelte 的 {#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。
使用 @inertiajs/vue3 提供的 <Link> 组件,页面跳转通过 XHR 完成,避免整页重载。
写法和普通 <a> 一样,但幕后 Inertia 只替换页面组件,体验接近 SPA。

Form 组件

@inertiajs/vue3 提供的 <Form> 组件是启动套件认证页面推荐的表单提交样式。通过 props 指定 actionmethod,再用 v-slot 访问 errorsprocessing

基本用法

v-slot="{ errors, processing }" 是 Vue 的作用域插槽语法,Form 组件会自动算出这些值并传入。表单字段用 HTML 原生的 name 属性而不是 v-model,让浏览器的标准表单数据采集照常工作。

启动套件的模式

启动套件通过 Wayfinder 把路由作为对象管理。store.form() 返回包含路由对象 actionmethod 的对象,用 v-bind 展开到 <Form>
reset-on-success 中列出的字段会在提交成功后自动重置。密码等提交完希望清空的字段可以列在这里。
不用 Wayfinder 时,直接传 action="/login" 就能达到同样效果。

useForm helper

表单处理使用 @inertiajs/vue3useForm helper,可以简洁实现表单状态管理、提交、校验错误显示。

控制器侧

Vue 表单组件

useForm 返回对象的主要属性: 校验返回错误时,useForm 会保留已输入内容并显示错误。配合 v-model 可以实现顺滑的表单体验。

共享数据(Shared Data)

所有页面共用的数据(登录中的用户信息、闪存消息等)可以在 HandleInertiaRequests 中间件的 share() 方法中定义。
在 Vue 组件中通过 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 的完整功能请参考官方文档。
最后修改于 2026年7月18日