fill()
Метод fill класса Component в Livewire используется для массового присвоения значений публичным свойствам компонента. Он принимает массив, где ключи соответствуют именам свойств, а значения - данным, которые нужно установить. Метод удобен для заполнения формы данными, особенно при редактировании существующих записей.
Синтаксис
<?php
$this->fill([
'prop1' => 'value1',
'prop2' => 'value2',
]);
?>
Пример
Допустим, у нас есть компонент для редактирования пользователя. Используем метод fill для заполнения свойств компонента данными из полученной модели:
<?php
namespace AppLivewire;
use LivewireComponent;
use AppModelsUser;
class EditUser extends Component
{
public $userId;
public $name;
public $email;
public $role;
public function mount($id)
{
$user = User::find($id);
if ($user) {
$this->fill([
'userId' => $user->id,
'name' => $user->name,
'email' => $user->email,
'role' => $user->role,
]);
}
}
public function render()
{
return view('livewire.edit-user');
}
}
?>
<div>
<input type="text" wire:model="name" placeholder="Name">
<input type="email" wire:model="email" placeholder="Email">
<select wire:model="role">
<option value="admin">Admin</option>
<option value="user">User</option>
</select>
<p>Editing user ID: {{ $userId }}</p>
</div>
Результат выполнения кода:
<div>
<input type="text" wire:model="name" placeholder="Name" value="John Doe">
<input type="email" wire:model="email" placeholder="Email" value="john@example.com">
<select wire:model="role">
<option value="admin" selected>Admin</option>
<option value="user">User</option>
</select>
<p>Editing user ID: 5</p>
</div>
Пример
Метод fill также можно использовать для заполнения свойств компонента в ответ на действие пользователя. Например, после загрузки данных из внешнего источника:
<?php
namespace AppLivewire;
use LivewireComponent;
use IlluminateSupportFacadesHttp;
class UserProfile extends Component
{
public $profileData = [];
public $bio;
public $location;
public $website;
public function loadProfile($apiData)
{
$this->fill([
'bio' => $apiData['bio'] ?? '',
'location' => $apiData['location'] ?? '',
'website' => $apiData['website'] ?? '',
]);
$this->profileData = $apiData;
}
public function refreshData()
{
$response = Http::get('https://api.example.com/user/profile');
if ($response->successful()) {
$this->loadProfile($response->json());
}
}
public function render()
{
return view('livewire.user-profile');
}
}
?>
<div>
<button wire:click="refreshData">Load Profile</button>
@if(!empty($bio))
<p><strong>Bio:</strong> {{ $bio }}</p>
<p><strong>Location:</strong> {{ $location }}</p>
<p><strong>Website:</strong> {{ $website }}</p>
@endif
</div>
Результат выполнения кода после нажатия кнопки:
<div>
<button wire:click="refreshData">Load Profile</button>
<p><strong>Bio:</strong> Developer from Russia</p>
<p><strong>Location:</strong> Moscow</p>
<p><strong>Website:</strong> example.com</p>
</div>