主题
#[Isolate]
#[Isolate] 属性防止组件的请求与其他组件更新捆绑,允许它并行执行。
为什么捆绑很重要
Livewire 中的每个组件更新都会触发一个网络请求。默认情况下,当多个组件同时触发更新时,它们会被捆绑到单个请求中。
这减少了到服务器的网络连接数量,可以大大减少服务器负载。除了性能提升外,这还在内部解锁了需要多个组件协作的功能(响应式属性、可模型化属性 等)。
然而,有时出于性能原因需要禁用此捆绑。这就是 #[Isolate] 的用武之地。
基本用法
将 #[Isolate] 属性应用于任何应发送隔离请求的组件:
php
<?php // resources/views/components/post/⚡show.blade.php
use Livewire\Attributes\Isolate;
use Livewire\Component;
use App\Models\Post;
new #[Isolate] class extends Component { // [tl! highlight]
public Post $post;
public function refreshStats()
{
// Expensive operation...
$this->post->recalculateStatistics();
}
};使用 #[Isolate],此组件的请求将不再与其他组件更新捆绑,允许它们并行执行。
捆绑何时有帮助 vs 何时有害
捆绑对大多数场景都很好,但如果组件执行昂贵的操作,捆绑可能会减慢整个请求。隔离该组件允许它与其他更新并行运行。
何时使用
在以下情况使用 #[Isolate]:
- 组件执行昂贵的操作(复杂查询、API 调用、繁重计算)
- 多个组件使用
wire:poll而你想要独立的轮询间隔 - 组件监听事件而你不想让一个慢组件阻塞其他组件
- 组件不需要与页面上的其他组件协调
示例:轮询组件
这是一个有多个轮询组件的实际示例:
php
<?php // resources/views/components/⚡system-status.blade.php
use Livewire\Attributes\Isolate;
use Livewire\Component;
new #[Isolate] class extends Component { // [tl! highlight]
public function checkStatus()
{
// Expensive external API call...
return ExternalService::getStatus();
}
};blade
<div wire:poll.5s>
Status: {{ $this->checkStatus() }}
</div>没有 #[Isolate],这个组件的慢 API 调用会延迟页面上的其他组件。有了它,组件独立轮询而不阻塞其他组件。
懒加载组件默认是隔离的
使用 #[Lazy] 属性时,组件会自动隔离以并行加载。如果需要,你可以禁用此行为:
php
<?php // resources/views/components/⚡revenue.blade.php
use Livewire\Attributes\Lazy;
use Livewire\Component;
new #[Lazy(isolate: false)] class extends Component { // [tl! highlight]
// ...
};现在多个 revenue 组件会将它们的懒加载请求捆绑到单个网络请求中。
权衡
优点:
- 防止慢组件阻塞其他更新
- 允许昂贵操作的真正并行执行
- 独立的轮询和事件处理
缺点:
- 更多的服务器网络请求
- 无法与同一请求中的其他组件协调
- 来自多个连接的服务器开销略高