3.8. Вычисляемые свойства

Вычисляемые свойства — это способ создания «производных» свойств в Livewire. Подобно аксессорам в модели Eloquent, вычисляемые свойства позволяют получать значения и кэшировать их для повторного использования в рамках одного запроса.

Вычисляемые свойства особенно полезны в сочетании с публичными свойствами компонента.

1. Базовое использование

Чтобы создать вычисляемое свойство, добавьте атрибут #[Computed] над любым методом в вашем компоненте Livewire. После этого вы сможете обращаться к этому методу так же, как к обычному свойству.

Убедитесь, что вы импортировали классы атрибутов

Убедитесь, что вы импортировали все используемые атрибуты. Например, для атрибута #[Computed] необходимо добавить следующий импорт: use Livewire\Attributes\Computed;.

Например, вот компонент ShowUser, который использует вычисляемое свойство user() для доступа к Eloquent-модели User на основе свойства $userId:

<?php
 
use Illuminate\Support\Facades\Auth;
use Livewire\Attributes\Computed;
use Livewire\Component;
use App\Models\User;
 
class ShowUser extends Component
{
public $userId;
 
#[Computed]
public function user()
{
return User::find($this->userId);
}
 
public function follow()
{
Auth::user()->follow($this->user);
}
 
public function render()
{
return view('livewire.show-user');
}
}
<div>
<h1>{{ $this->user->name }}</h1>
 
<span>{{ $this->user->email }}</span>
 
<button wire:click="follow">Follow</button>
</div>

Поскольку к методу user() добавлен атрибут #[Computed], его значение доступно в других методах компонента и в Blade-шаблоне.

В шаблоне необходимо использовать $this

В отличие от обычных свойств, вычисляемые свойства напрямую недоступны в шаблоне компонента. Вместо этого к ним нужно обращаться через объект $this. Например, к вычисляемому свойству posts() нужно обращаться как $this->posts внутри шаблона.

Вычисляемые свойства не поддерживаются в объектах Livewire\Form.

Попытка использовать вычисляемое свойство внутри Form приведёт к ошибке при обращении к этому свойству в Blade-шаблоне с помощью синтаксиса $form->property.

2. Преимущество в производительности