Livewire循环日期输入框修改$term后少渲染1个输入框的Bug排查
问题原因
- 循环变量未初始化:你当前的for循环写法
@for ($i; $i <= $term-1; $i++)没有给$i设置初始值0,Livewire每次重新渲染组件时,不会自动重置模板内的临时变量,上次循环结束后$i已经保留了上次遍历的最终值,下次渲染直接从该值开始遍历,就会出现少渲染输入框的问题。 - 动态节点缺少唯一标识:循环生成的输入框根节点没有设置
wire:key,Livewire做DOM diff时无法精准识别每个节点,会出现节点复用错误,也可能导致渲染数量异常。
修复方案
- 首先修正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、数组字段校验错误的问题,符合表单开发规范
- 可选优化:在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
相关产品推荐
相关产品推荐

