Livewire 3 能运行只需三步:正确安装、组件继承 Livewire\Component、Blade 中用 @livewire 声明;90% 失败源于这三步未落实,而非逻辑错误。

Livewire 3 不需要“完整教程”就能跑起来——它只要求三件事:正确安装、组件类继承 Livewire\Component、Blade 中用 @livewire 声明。其余失败,90% 是卡在这三步的某个环节,而不是逻辑写错了。
安装后没反应?先确认 @livewireScripts 放对位置
这是最常被忽略的硬性前提:@livewireScripts 必须出现在 </body> 之前,且不能被任何条件包裹(比如 @if(auth()->check()))。如果它在 <head> 里、被注释掉、或放在自定义 @stack('scripts') 之后但没 push,$wire 就不会注入,所有 wire:click、wire:model 都静默失效。
-
@livewireStyles要放在</head>前,否则样式可能错乱(比如加载闪烁) - 不要在布局里写
@livewireScripts(['defer'])—— Livewire 3 的 JS 不支持defer,会直接不执行 - 如果用了多层布局(比如
app.blade.php→dashboard.blade.php),确保最终渲染的页面包含这两个指令,而不是只在父级 layout 里写了
mount() 没执行?检查组件是否被框架真正挂载
现象是页面能显示,但初始化逻辑(如查数据库、设默认值)完全没跑。mount() 只在 Livewire 组件由框架自动实例化时才触发,手动 new、@include、或路由直连类名都会跳过它。
- Blade 中必须用
@livewire('counter')或<livewire:counter />,不能用@include('livewire.counter') - 组件类第一行必须是
class Counter extends \Livewire\Component,漏掉\Livewire\Component或写成use Livewire; class Counter extends Component(没加反斜杠)都会导致挂载失败 - 如果组件在子命名空间(如
App\Livewire\Admin\Dashboard),注册时别写完整类名:@livewire('admin.dashboard'),除非你显式调用Livewire::component('admin.dashboard', Dashboard::class) - 运行
php artisan livewire:discover强制刷新组件缓存,新增组件后没反应时必做
表单提交后跳转或刷新?重点盯 wire:submit.prevent 和响应体
Livewire 表单不是靠 JS 提交,而是拦截原生 submit 事件并发起 XHR。一旦失败,就退化为传统 POST + 页面跳转,看起来像“点了没反应”,其实是前端根本没收到 JSON 响应。
-
wire:submit.prevent="save"中的.prevent不能拼错(比如写成preven)、不能漏点号、不能和 Alpine 的x-on:submit.prevent混用(会冲突) - 对应方法必须是 public:
public function save(),且不能有参数(Livewire 不传参,靠wire:model同步属性) - 打开浏览器 Network 面板,筛选
X-Livewire请求:正常响应是纯 JSON(含"html"和"effects"字段);如果返回 HTML、空内容、或 500 错误页,说明中间件、mount()、或render()抛了异常但被吞了 - 开发阶段建议运行
php artisan livewire:publish --config,把'dev_mode' => true打开,能让错误堆栈透出到响应体里
数据不更新、输入无响应?看 wire:model 绑定和属性可见性
wire:model 不是魔法,它只同步 public 属性。哪怕只错一个字母,或者属性被声明为 protected,前端输再多次,PHP 端都收不到值。
-
<input wire:model="search">要求组件里有public $search = '';写成public string $search = ''(PHP 8.0+ 类型声明)会导致同步失败 - 实时搜索推荐用
wire:model.live="search",避免防抖延迟;普通表单用wire:model.defer="title"可延迟到失焦再同步 - 不要在
render()方法里 return view() 时传参覆盖属性,例如return view('xxx', ['search' => 'xxx'])—— 这会切断双向绑定,后续输入不再更新$this->search - 如果用了
wire:ignore或wire:ignore.self包裹富文本编辑器等第三方组件,里面的内容不会被 Livewire 管理,得手动用$wire.set()同步
真正卡住人的从来不是语法细节,而是 Livewire 的“隐式契约”:它要求你严格遵守它的生命周期和挂载规则。一旦绕过(比如手动 new、@include、漏 @livewireScripts),它就彻底静默——没有报错,只有失效。调试时第一反应不该是“我代码哪里错了”,而是“它到底有没有真正启动”。


















