为什么在组件的调用方法中项目列表为空?

Why listing of items is empty in calling method of the component?

使用 livewire 2 我有项目列表($itemDataRows var),我需要任何项目显示复选框($selectedItems var)和 “Select 全部”按钮并单击此按钮必须选择所有项目。我愿意 :

class CrudItems extends Component
{
    private $itemDataRows = [];
    public $selectedItems = [];
    ...

    public function render()
    {
        ...
        $this->itemDataRows   = Item
            ::orderBy('created_at', 'desc')
            ...
            ->paginate($backend_per_page);

        return view('livewire.admin.items.crud-items', [
            'itemDataRows'    => $this->itemDataRows,
            'item_rows_count' => $this->item_rows_count
        ])->layout('layouts.admin');
        }
    }


    public function calcSelectedItemsCount()
    {
        $ret= 0;
        foreach( $this->selectedItems as $next_key=>$next_value ) {
            if($next_value) {
                $ret++;
            }
        }
        return $ret;
    }

    public function selectAllItems()
    {
        $this->selectedItems= [];
        \Log::info(  dump($this->itemDataRows, ' -0 $this->itemDataRows selectAllItems::') );
        // INL OG FILE_I SEE THAT ARRAY ABOVE IS EMPTY!!!
        foreach( $this->itemDataRows as $nextItemDataRow ) {
            $this->selectedItems[$nextItemDataRow->id] = true;
            \Log::info(  dump($this->selectedItems, ' -$this->selectedItems INSIDE selectAllItems::') );
        }
        \Log::info(  dump($this->selectedItems, ' -$this->selectedItems selectAllItems::') );
    }

并在模板中:

        $selectedItems::{{ var_dump($selectedItems) }}<hr>
        $itemDataRows::{{ $itemDataRows }}
/* $selectedItems is filled ok when I click on checkboxes , but $itemDataRows shows empty var, though I filled items listing below */

  @foreach ($itemDataRows as $item)
    <tr>
      <td class=" whitespace-nowrap  ">
          <x-jet-checkbox id="is_reopen" type="checkbox" class="editor_checkbox_field ml-4" title="On saving editor will be opened"
          wire:model="selectedItems.{{ $item->id }}"/>
     </td>

$itemDataRows 的定义有问题吗?为什么在 selectAllItems 方法中 $itemDataRows 为空,但在我的模板上所有项目都可见 ok....

提前致谢!

在 Livewire 中,您可以通过 class 变量传递数据。在 mount 函数中,您可以填充变量。例如。

重要提示: Class 变量必须是 public!

public $selectedItems = [];

public function mount(): void
{
    $this->selectedItems = ['data' => 'Hello World'];
}

public function render()
{
    return view('livewire.admin.items.crud-items')->layout('layouts.admin');
}

更新

这一定和Livewire Lifecyle有关。每个 Livewire 组件都会经历一个生命周期。生命周期挂钩允许您 运行 在组件生命周期的任何阶段或更新某些属性之前进行编码。在你的情况下,使用挂载挂钩。

您在渲染函数中初始化变量 itemDataRows。然后请求调用方法 selectAllItems。在那里你必须再次初始化 itemDataRows,因为状态在渲染或装载期间不再存在。

解决方法: 创建方法 getItemDataRows()

private getItemDataRows()
{
   $this->itemDataRows => Item::orderBy('created_at', 'desc')
            ...
            ->paginate($backend_per_page);
}

然后您也可以在 render 方法和 selectAllItems 方法中调用它们。

public function selectAllItems()
{
    $this->selectedItems= [];
    $this->itemDataRows => $this->getItemDataRows();
    ...
    // your code
}