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

Livewire表单无法提交数据:cotizar方法无法获取cotacao值

问题分析与解决方案

核心错误原因

Livewire的组件通信逻辑和传统Laravel表单提交不同,你犯了三个关键错误:

  1. 不该在Livewire方法中接收Request实例:Livewire通过组件的公共属性自动同步前端输入值,不需要手动注入Request对象。
  2. 未定义组件的公共属性:你用了wire:model.defer="cotacao"绑定输入框,但组件类里没有对应的公共$cotacao属性,导致前端输入值无法同步到后端。
  3. 多余的表单标签: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:52:58