Skip to content

#[Defer]

#[Defer] 属性使组件在初始页面加载完成后立即加载,防止慢速组件阻塞页面渲染。

基本用法

#[Defer] 属性应用于任何应被延迟的组件:

php
<?php // resources/views/components/⚡revenue.blade.php

use Livewire\Attributes\Defer;
use Livewire\Component;
use App\Models\Transaction;

new #[Defer] class extends Component { // [tl! highlight]
    public $amount;

    public function mount()
    {
        // Slow database query...
        $this->amount = Transaction::monthToDate()->sum('amount');
    }
};
?>

<div>
    Revenue this month: {{ $amount }}
</div>

使用 #[Defer],组件最初渲染为空的 <div></div>,然后在页面完成加载后立即加载——无需等待它进入视口。

Lazy vs Defer

Livewire 提供两种延迟组件加载的方式:

  • 懒加载(#[Lazy] - 组件在进入视口时加载(当用户滚动到它们时)
  • 延迟加载(#[Defer] - 组件在初始页面加载完成后立即加载

两者都防止慢速组件阻塞初始页面渲染,但在组件实际加载的时间上有所不同。

渲染占位符

默认情况下,Livewire 在组件加载之前渲染空的 <div></div>。你可以使用 placeholder() 方法提供自定义占位符:

php
<?php // resources/views/components/⚡revenue.blade.php

use Livewire\Attributes\Defer;
use Livewire\Component;
use App\Models\Transaction;

new #[Defer] class extends Component {
    public $amount;

    public function mount()
    {
        $this->amount = Transaction::monthToDate()->sum('amount');
    }

    public function placeholder() // [tl! highlight:start]
    {
        return <<<'HTML'
        <div>
            <svg><!-- Loading spinner... --></svg>
        </div>
        HTML;
    } // [tl! highlight:end]
};
?>

<div>
    Revenue this month: {{ $amount }}
</div>

用户将看到加载旋转器直到组件完全加载。

匹配占位符元素类型

如果占位符的根元素是 <div>,你的组件也必须使用 <div> 元素。

捆绑请求

默认情况下,延迟组件使用独立的网络请求并行加载。要将多个延迟组件捆绑到单个请求中,使用 bundle 参数:

php
<?php // resources/views/components/⚡revenue.blade.php

use Livewire\Attributes\Defer;
use Livewire\Component;

new #[Defer(bundle: true)] class extends Component { // [tl! highlight]
    // ...
};

现在,如果页面上有十个 revenue 组件,所有十个都将通过单个捆绑的网络请求加载,而不是十个并行请求。

替代方法

使用 defer 参数

除了属性,你可以使用 defer 参数延迟特定的组件实例:

blade
<livewire:revenue defer />

当你只想延迟组件的某些实例时,这很有用。

覆盖属性

如果组件有 #[Defer] 但你想在某些情况下立即加载它,你可以覆盖它:

blade
<livewire:revenue :defer="false" />

何时使用

在以下情况使用 #[Defer]

  • 组件包含会延迟页面加载的慢操作(数据库查询、API 调用)
  • 组件在初始页面加载时始终可见(如果它在折叠下方,请改用 #[Lazy]
  • 你想通过更快地显示页面来提高感知性能

了解更多

有关懒加载和延迟加载的完整文档,包括占位符和捆绑策略,请参阅懒加载文档

参考

php
#[Defer(
    bool|null $bundle = null,
)]
参数类型默认值描述
$bundlebool|nullnull将多个延迟组件捆绑到单个网络请求中