嵌套 Livewire 组件在更新时重置值

Nesting Livewire components resetting values on update

我正在尝试更新嵌套数组中 Livewire 组件上的数据,但它们没有像我希望的那样运行。我正在尝试利用多维数组来管理多个输入的数据,如下所示。

@foreach ($items as $item)
   <input wire:model="items.{{ $item->id }}.employee_id" type="text">
   <input wire:model="items.{{ $item->id }}.name" type="text">
@endforeach

我 运行 在向这些输入中输入数据时遇到了问题。它将更新一个值(例如 items.3.name)并将多维数组中的所有其他数据重置回其原始值。

阅读 Livewire 要求后,我尝试更改页面上的规则,但这没有帮助。这是我的控制器的片段:

public $items = [];
protected $rules = [
    'items.*.employee_id' => 'required',
    'items.*.name' => 'required',
];

public function mount() {
    $this->items = Employees::all()->toArray();
}

public function render() {
    return view('livewire.employees');
}

public function updatedName() {
    dd($this->items);
}

据我所知,这应该有效。我错过了什么?

如果 $items 是一个数组,您应该知道数组索引从 0 开始。因此,当您在 blade

中编写此代码时
<input wire:model="items.{{ $item->id }}.employee_id" type="text">

$item->id 值可以是例如。 200,但数组没有索引 200,那么你将遍历数组索引,而不是遍历模型 ID 值

当您引用此内容时:

$this->items = User::all()->toArray();

输出是这样的:

array: 3 [
 0 => array:6[
   "id" => 34
   "name" => "First Name"
   "email" => "firstname@email.com"
   //...
 ]
 1 => array:6[
   "id" => 47
   "name" => "Second Name"
   "email" => "secondname@email.com"
   //...
 ]
 2 => array:6[] 
]

我认为正确的循环方式是:

@foreach($items as $key => $item)
  <input wire:model="items.{{ $key }}.name" type="text">
  <input wire:model="items.{{ $key }}.email" type="email">
@endforeach

当然,就像 Quirel 所说的那样,您应该将其包装在根元素中并添加 wire:key 指令

@foreach($items as $key => $item)
  <div wire:key="input-group-{{ $key }}">
    <input wire:model="items.{{ $key }}.name" type="text">
    <input wire:model="items.{{ $key }}.email" type="email">
  </div>
@endforeach