You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Livewire组件中提交传统Blade表单?报wire-directives.js错误

报错原因

这个错误来自Livewire前端指令解析逻辑的误判:

  • 你表单里的邮箱输入框写了:value="old('email')",这种冒号开头的属性绑定语法是Livewire、Alpine这类组件框架识别的前端绑定语法,普通Blade模板不会解析这个写法,会直接把它当成无意义的自定义HTML属性渲染,所以你之前在默认Blade页面用的时候不会触发JS报错——顺带一提,这个写法在普通Blade里本身就是错误的,邮箱输入框的old值回显从来没生效过,只是你没注意到。
  • 当这个表单被放到Livewire组件的渲染范围内时,wire-directives.js会扫描DOM里所有wire:、:开头的属性,尝试把它们解析成Livewire指令,但是这个:value既没有绑定Livewire的组件属性,表单本身也不是Livewire托管的表单,解析过程中拿到空值就调用match方法,直接抛出了Cannot read properties of null (reading 'match')的错误。
    另外你写的密码输入框重复声明了两次type="password",属于冗余代码,虽然不触发当前报错但建议清理。
修复方案

根据你要不要用Livewire做异步提交,二选一即可:

方案1:保留传统同步表单提交逻辑

这是改动最小的方案,不需要改原有登录逻辑:

  1. 修正邮箱输入框的value绑定写法,去掉冒号,改成Blade原生的输出写法:
<input type="email" id="email" class="form-control" name="email" value="{{ old('email') }}" required placeholder="email">
  1. 给表单标签加上wire:ignore属性,告诉Livewire不要扫描、接管这个表单内部的DOM,避免JS误解析:
<form wire:ignore role="form" class="text-start" method="POST" action="{{ route('login') }}">
  1. 删掉密码输入框里重复的type="password"属性即可。
    改完之后表单的提交逻辑和你之前在普通Blade模板里完全一致,不会再触发控制台报错。

方案2:改造为Livewire异步无刷新提交表单

如果你想让登录走Livewire的无刷新提交,需要对表单做对应改造,不能直接复用原表单的传统提交逻辑:

  • 去掉form标签的action、method属性,加上wire:submit.prevent="login"绑定组件内的登录方法
  • 删掉表单里的@csrf声明,Livewire提交请求时会自动携带CSRF令牌
  • 去掉输入框手写的value、name属性,改用wire:model绑定Livewire组件内的公开属性:邮箱输入框加wire:model="email"、密码输入框加wire:model="password"、记住我勾选框加wire:model="remember"
  • 在对应的Livewire组件类里编写login方法,直接调用Laravel自带的Auth认证逻辑完成登录校验、跳转即可。

内容的提问来源于stack exchange,提问作者adeab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 09:51:45