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

Livewire循环日期输入框修改$term后少渲染1个输入框的Bug排查

问题原因
  • 循环变量未初始化:你当前的for循环写法@for ($i; $i <= $term-1; $i++)没有给$i设置初始值0,Livewire每次重新渲染组件时,不会自动重置模板内的临时变量,上次循环结束后$i已经保留了上次遍历的最终值,下次渲染直接从该值开始遍历,就会出现少渲染输入框的问题。
  • 动态节点缺少唯一标识:循环生成的输入框根节点没有设置wire:key,Livewire做DOM diff时无法精准识别每个节点,会出现节点复用错误,也可能导致渲染数量异常。
修复方案
  1. 首先修正for循环的初始值,同时给循环根节点添加唯一的wire:key属性,修改后的循环代码如下:
@for ($i = 0; $i < $term; $i++) 
    <div class="form-group row" wire:key="date-input-{{ $i }}">
        <label for="date-{{ $i }}" class="col-md-3 col-form-label">
            <small>{{$i+1}}.</small> Date
            <span style="color: red">*</span>
        </label>
        <div class="col-md-9">
            <input 
                class="form-control @error('date.'.$i) is-invalid @enderror" 
                id="date-{{ $i }}" 
                type="date" 
                wire:model.defer="date.{{$i}}"
            >
            @error('date.'.$i) 
                <div class="invalid-feedback">{{ $message }}</div>
            @enderror
        </div>
    </div>
@endfor

提示:上述代码同步修正了原代码中的重复ID、数组字段校验错误的问题,符合表单开发规范

  1. 可选优化:在Livewire组件类中添加term属性更新的回调,同步调整date数组的长度,避免绑定异常:
// 写在对应的Livewire组件类中
public function updatedTerm()
{
    $date = $this->date ?? [];
    // 截断超出term长度的部分,不足的部分补空值
    $this->date = array_pad(array_slice($date, 0, $this->term), $this->term, '');
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 08:27:02