![](/img/trans.png)
[英]Laravel-livewire: Why does firing an event execute the render() method?
[英]Why does Livewire run a new query on each render and why are relationships lost
我正在創建一個多列用戶索引頁面,其中右列顯示左列中選擇的用戶的詳細信息。 選中后,用戶不會被拉出集合,而是剛從數據庫中拉出,因此數據是最新的。
我使用 livewire 文檔中描述的方法來延遲加載用戶列表。
用戶具有“角色”關系,顯示在列表列中。
我希望一旦將 $this→users 設置為用戶的集合並選擇了一個用戶,只有查詢才會觸發以獲取該用戶的數據。
當一個用戶被選中時,從數據庫中獲取所有用戶的查詢(再次)運行,並且由於來自用戶的角色顯示在列表視圖中的事實,對於每個用戶,一個新的查詢被執行。 之后,執行獲取所選用戶的查詢。 之后,另一個用於獲取用戶角色的查詢被觸發。
<?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,
]
);
}
}
<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.