Атрибут Renderless
Атрибут #[Renderless] применяется к классу компонента Livewire
и указывает, что компонент не использует шаблон для рендеринга.
Вместо этого метод render должен возвращать массив или объект
с данными, которые будут переданы в родительский компонент
или использованы для API-ответов. Это полезно для создания
компонентов-прослоек, которые обрабатывают логику,
но не выводят HTML напрямую.
Синтаксис
<?php
namespace App\Livewire;
use Livewire\Component;
use Livewire\Attributes\Renderless;
#[Renderless]
class ComponentName extends Component
{
public function render()
{
return [
'key' => 'value',
];
}
}
?>
Пример
Давайте создадим компонент-калькулятор, который не имеет шаблона и возвращает результат вычислений:
<?php
namespace App\Livewire;
use Livewire\Component;
use Livewire\Attributes\Renderless;
#[Renderless]
class Calculator extends Component
{
public $a = 10;
public $b = 5;
public $operation = 'add';
public function render()
{
$result = match($this->operation) {
'add' => $this->a + $this->b,
'sub' => $this->a - $this->b,
'mul' => $this->a * $this->b,
'div' => $this->a / $this->b,
default => 0,
};
return [
'result' => $result,
'a' => $this->a,
'b' => $this->b,
'operation' => $this->operation,
];
}
}
?>
Результат выполнения метода render:
[
'result' => 15,
'a' => 10,
'b' => 5,
'operation' => 'add',
]
Пример
Используем #[Renderless] для компонента,
который возвращает данные пользователя:
<?php
namespace App\Livewire;
use Livewire\Component;
use Livewire\Attributes\Renderless;
use App\Models\User;
#[Renderless]
class UserData extends Component
{
public $userId;
public function render()
{
$user = User::find($this->userId);
return [
'id' => $user->id,
'name' => $user->name,
'email' => $user->email,
'created_at' => $user->created_at->format('Y-m-d'),
];
}
}
?>
Результат выполнения кода:
[
'id' => 1,
'name' => 'John Doe',
'email' => 'john@example.com',
'created_at' => '2025-01-15',
]
Пример
Компонент без шаблона может использоваться для API-подобных ответов в сочетании с другими атрибутами:
<?php
namespace App\Livewire;
use Livewire\Component;
use Livewire\Attributes\Renderless;
use Livewire\Attributes\Validate;
#[Renderless]
class ApiComponent extends Component
{
#[Validate('required|min:3')]
public $search = '';
public function render()
{
$items = ['apple', 'banana', 'cherry'];
$filtered = array_filter($items, function($item) {
return str_contains($item, $this->search);
});
return [
'status' => 'success',
'data' => array_values($filtered),
'count' => count($filtered),
];
}
}
?>
Результат выполнения кода при search='an':
[
'status' => 'success',
'data' => ['banana'],
'count' => 1,
]