Атрибут Computed⚓︎
Атрибут #[Computed] позволяет создавать производные свойства, которые кэшируются во время запроса, обеспечивая преимущество в производительности при многократном обращении к ресурсозатратным операциям.
Базовое использование⚓︎
Примените атрибут #[Computed] к любому методу, чтобы превратить его в кэшируемое свойство:
<?php
use Livewire\Attributes\Computed;
use Livewire\Component;
use App\Models\User;
new class extends Component {
public $userId;
#[Computed]
public function user()
{
return User::find($this->userId);
}
public function follow()
{
Auth::user()->follow($this->user);
}
};
<div>
<h1>{{ $this->user->name }}</h1>
<span>{{ $this->user->email }}</span>
<button wire:click="follow">Подписаться</button>
</div>
Доступ к методу user() осуществляется как к свойству через $this->user. При первом вызове результат кэшируется и повторно используется до конца запроса.
Необходимо использовать $this в шаблонах
В отличие от обычных свойств, к вычисляемым свойствам в шаблоне нужно обращаться через $this. Например, $this->posts вместо $posts.
Преимущество в производительности⚓︎
Вычисляемые свойства кэшируют свой результат на время выполнения запроса. Если вы обращаетесь к $this->posts несколько раз, базовый метод выполнится только один раз:
<?php
use Illuminate\Support\Facades\Auth;
use Livewire\Attributes\Computed;
use Livewire\Component;
new class extends Component {
#[Computed]
public function posts()
{
return Auth::user()->posts; // Выполняет запрос к базе данных только один раз
}
};
Это позволяет свободно обращаться к производным значениям, не беспокоясь о влиянии на производительность.
Сброс кэша⚓︎
Если базовые данные изменяются во время запроса, вы можете очистить кэш с помощью unset():
```php hl_lines="22 title="resources/views/components/post/⚡index.blade.php"
posts; } public function createPost() { if ($this->posts->count() > 10) { throw new \Exception('Превышено максимальное количество постов'); } Auth::user()->posts()->create(...); unset($this->posts); // Очистка кэша } };После создания нового поста `unset($this->posts)` очищает кэш, поэтому при следующем обращении будут получены обновлённые данные.
## Кэширование между запросами
По умолчанию вычисляемые свойства кэшируются только в рамках одного запроса. Чтобы кэшировать их между несколькими запросами, используйте параметр `persist`:
```php hl_lines="1"
<?php
#[Computed(persist: true)]
public function user()
{
return User::find($this->userId);
}