簡體   English   中英

為什么 Livewire 會在每次渲染時運行一個新查詢以及為什么會丟失關系

[英]Why does Livewire run a new query on each render and why are relationships lost

設想

我想做什么

我正在創建一個多列用戶索引頁面,其中右列顯示左列中選擇的用戶的詳細信息。 選中后,用戶不會被拉出集合,而是剛從數據庫中拉出,因此數據是最新的。

我使用 livewire 文檔中描述的方法來延遲加載用戶列表。

用戶具有“角色”關系,顯示在列表列中。

我的期望

我希望一旦將 $this→users 設置為用戶的集合並選擇了一個用戶,只有查詢才會觸發以獲取該用戶的數據。

實際發生了什么

當一個用戶被選中時,從數據庫中獲取所有用戶的查詢(再次)運行,並且由於來自用戶的角色顯示在列表視圖中的事實,對於每個用戶,一個新的查詢被執行。 之后,執行獲取所選用戶的查詢。 之后,另一個用於獲取用戶角色的查詢被觸發。

所以我的問題

  1. 為什么 Livewire 會丟失在第一個公開 $users 聲明中急切加載的關系?
  2. 為什么 Livewire 重新運行查詢以獲取所有用戶,而 public $users 已經定義為用戶集合?

文件:

  • UserListDetail.php
    <?php

    namespace App\Http\Livewire;

    use App\Models\User;
    use Livewire\Component;

    class UsersListDetail extends Component {

        public string $search   = '';
        public        $users;
        public        $selectedUser;
        public int    $timesRun = 0;

        public bool $readyToLoadUserList = false;

        protected $queryString = [
            'search' => [ 'except' => '' ],
        ];

        // Defer loading users
        public function readyToLoadUserList()
        {
            // Get all users with roles relationship
            $this->users = User::with('roles')->get();

            $this->readyToLoadUserList = true;
        }

        public function selectUser(int $userId)
        {
            $this->selectedUser = User::with('roles')->find($userId);
        }

        public function render()
        {
            return view('livewire.users-list-detail', [
                    'selectedUser' => $this->selectedUser,
                ]
            );
        }
    }
  • user-list-detail.blade.php 的簡化版本
<div>
    <div wire:init="readyToLoadUserList">
        @if($readyToLoadUserList)
            <ul>
                @foreach($users as $user)
                    <li wire:click="selectUser({{ $user->id }})">
                        {{ $user→name_first }} {{ $user→name_last }},
                        @foreach($user→roles as $role)
                            {{ $role→label }},
                        @endforeach
                    </li>
                @endforeach
            </ul>
        @endif
    </div>

    <div>
        @isset($selectedUser)
            {{ $name_first
        @endisset
    </div>
</div>

selectUser()方法被觸發時,livewire 將重新渲染刀片,並且由於wire:init="readyToLoadUserList"在那里,它將(再次)加載每個用戶。

mount()替換readyToLoadUserList() ) 並簡單地將wire:init=""保持為空。

此外,條件為@if($users->count() > 0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM