状态,和页面在一起
字段绑定到组件属性,提交时不需要另写一套状态管理。
public string $title = '';01 / 交互的秩序
Livewire 让浏览器负责呈现,让 PHP 负责判断。你写下的每一行规则,都离业务更近。
以下内容介绍真实 Livewire 应用的工作方式;当前 Astro 静态站只阅读这些概念,不运行 Livewire。
字段绑定到组件属性,提交时不需要另写一套状态管理。
public string $title = '';在真实应用中,必填、长度和字段名称都在服务端确认,反馈直接回到输入框。
$this->validate(...)发布结果只存在于组件内存,读完即走,不给数据库添负担。
wire:loading02 / 从零开始
下面是 Livewire 4 官方快速上手的中文骨架,可以对照 4.x 快速上手 一起读。先理解这条链路,再用本页的静态演示体验浏览器本地校验。
官方要求 Laravel 10 及以上、PHP 8.1 及以上;本页内容以 Laravel 13 与 PHP 8.4 为例,完全兼容这条官方流程。
在 Laravel 项目根目录引入 Livewire 4,不需要再配前端框架。
composer require livewire/livewire布局负责引入样式、脚本,并用 {{ $slot }} 留出组件位置。
php artisan livewire:layout用页面组件名前缀保持整洁,生成后即可得到一个单文件组件。文件名中的闪电符号只是为了在编辑器中快速识别,也可以在配置中关闭。
php artisan make:livewire pages::post.create属性保存状态,方法处理提交,模板只负责呈现和反馈。
public string $title = '';
public function save(): void
{
$this->validate(['title' => 'required']);
}把组件挂到路由上,打开页面即可看到无刷新表单。
Route::livewire('/post/create', 'pages::post.create');把下面这份代码放进 resources/views/pages/post/⚡create.blade.php,就是官方演示用的文章表单。注意它刻意没有样式,重点是状态、校验和提交;以下代码只作说明,不会在 Astro 页面运行。
<?php
use Livewire\Component;
new class extends Component
{
public string $title = '';
public string $content = '';
public function save()
{
$this->validate([
'title' => 'required|max:255',
'content' => 'required',
]);
dd($this->title, $this->content);
}
};
?>
<form wire:submit="save">
<label>
Title
<input type="text" wire:model="title">
@error('title') <span>@{{ $message }}</span> @enderror
</label>
<label>
Content
<textarea wire:model="content" rows="5"></textarea>
@error('content') <span>@{{ $message }}</span> @enderror
</label>
<button type="submit">Save Post</button>
</form>$title 和 $content 保存用户输入,是组件在服务端的状态。save() 在提交时被调用,先校验,再用 dd() 输出结果,方便确认数据链路。wire:submit 阻止整页刷新并调用方法;wire:model 把输入框和属性连起来;@error 负责在字段下方显示错误。演示用 dd() 停下来看数据,真实项目通常是写入数据库再跳转。
public function save()
{
$validated = $this->validate([
'title' => 'required|max:255',
'content' => 'required',
]);
Post::create($validated);
return $this->redirect('/posts');
}在真实 Livewire 表单中,可以用加载指令禁用按钮、切换文案并播报进度;本页静态演示使用原生 JavaScript 实现相同状态。
<button type="submit"
wire:loading.attr="disabled"
wire:target="publish">
<span wire:loading.remove wire:target="publish">发布文章</span>
<span wire:loading wire:target="publish">正在发布…</span>
</button>在真实 Livewire 应用中空表单直接提交,应该在两个字段下方看到服务端返回的错误,而且页面没有刷新。
填好标题和内容再提交,应该能看到提交成功后的数据回显;在本页则使用浏览器本地校验与当前页面预览。
03 / 发布台
这是静态站演示:内容由浏览器本地校验,只在当前页面预览,不会发送到服务器,也不会运行 Livewire。
填写标题与内容
浏览器执行本地校验
在当前页面阅读预览
ARTICLE / 001
04 / 常见问题
这些都是 Livewire 4 新手最容易遇到的现场问题,对照检查即可。
先确认组件文件路径与路由中的组件名一致,例如页面组件应为 pages::post.create。再检查文件名、命名空间分隔符和路由拼写是否完全对应。
先检查布局里是否有 @livewireStyles 和 @livewireScripts,再打开浏览器控制台,看 Livewire 更新请求是否成功返回。
多半是路由没有注册或路径不一致。请确认 routes/web.php 中已经挂载对应组件,然后用 php artisan route:list 核对实际路径。
Livewire 需要用一个稳定的根节点跟踪组件状态。把模板内容包在一个 <form> 或 <div> 里,更新和校验才不会错位。
先看失败的是必填还是长度。空提交会触发必填错误;只有真正超过 80 或 2000 个字符时,才会触发长度错误,页面会明确告诉你是哪一种。
06 / 参与与许可
以下入口来自 Livewire 官方 README:贡献、行为准则、安全反馈和开源许可都在这里。
如果要直接参与 Livewire 框架本身,可以克隆官方仓库并用一条命令装好开发环境。
git clone git@github.com:livewire/livewire.git && cd livewire
composer setup07 / 技术栈
从真实 Livewire 项目的路由到构建,再回到当前静态站的发布链路,页面本身不依赖 UI 框架。
真实应用中,路由、会话与验证保持在同一条 PHP 请求链上。
单文件组件承载状态、动作与页面内反馈;当前页面仅展示官方用法。
用 Bun 安装依赖,用 Astro 生成可部署到 GitHub Pages 的静态站。
不引入 Tailwind、React 或 Vue,动效与表单都服务于阅读。