Livewire表单无法提交数据:cotizar方法无法获取cotacao值
问题分析与解决方案
核心错误原因
Livewire的组件通信逻辑和传统Laravel表单提交不同,你犯了三个关键错误:
- 不该在Livewire方法中接收
Request实例:Livewire通过组件的公共属性自动同步前端输入值,不需要手动注入Request对象。 - 未定义组件的公共属性:你用了
wire:model.defer="cotacao"绑定输入框,但组件类里没有对应的公共$cotacao属性,导致前端输入值无法同步到后端。 - 多余的表单标签:Livewire自带CSRF保护机制,无需手动添加
@csrf和@method('POST'),这些标签反而会干扰Livewire的原生提交逻辑。
修正步骤
1. 给Lead组件添加公共属性
在Lead.php组件类中定义与前端绑定对应的公共属性:
namespace App\Http\Livewire; use Livewire\Component; use App\Models\Preco; class Lead extends Component { // 新增公共属性,用于同步前端输入值 public $cotacao; // ... 其他已有代码 public function cotizar() { // 直接通过$this->cotacao获取前端输入的内容 dd($this->cotacao); $idades = explode(',', $this->cotacao); $precos = Preco::all(); $resultado = []; foreach ($precos as $preco) { $plano = $preco->dados[0][1]; foreach ($preco->dados as $dado) { if (in_array($dado[0], $idades)) { $resultado[] = [ 'idade' => $dado[0], 'preco' => $dado[1], 'plano' => $plano ]; } } } dd($resultado); } // ... 其他已有代码 }
2. 简化表单代码
移除多余的@csrf和@method('POST')标签,保留Livewire原生提交逻辑:
<form wire:submit.prevent="cotizar"> <input type="text" name="cotacao" class="form-control" wire:model.defer="cotacao" required> <span class="text-muted small">Digite as idades separadas por vírgula: '12, 23, 2x47'</span> <br> <button type="submit" class="btn btn-primary">Cotizar</button><br><br><br> </form>
补充说明
你使用的wire:model.defer是正确的,它会延迟数据同步到组件,直到表单提交时才一次性完成同步,符合你的提交场景。如果需要实时验证输入内容,可以去掉.defer后缀。
内容的提问来源于stack exchange,提问作者Marcello Pato
相关产品推荐
相关产品推荐

