Skip to content

wire:poll

轮询是 Web 应用程序中使用的一种技术,用于"轮询"服务器(定期发送请求)以获取更新。这是一种简单的方法,可以使页面保持最新,而无需使用像 WebSockets 这样更复杂的技术。

基本用法

在 Livewire 中使用轮询就像向元素添加 wire:poll 一样简单。

以下是显示用户订阅者数量的 SubscriberCount 组件的示例:

php
<?php

namespace App\Livewire;

use Illuminate\Support\Facades\Auth;
use Livewire\Component;

class SubscriberCount extends Component
{
    public function render()
    {
        return view('livewire.subscriber-count', [
            'count' => Auth::user()->subscribers->count(),
        ]);
    }
}
blade
<div wire:poll> <!-- [tl! highlight] -->
    Subscribers: {{ $count }}
</div>

通常,此组件会显示用户的订阅者数量,并且在刷新页面之前不会更新。但是,由于组件模板上的 wire:poll,此组件现在将每 2.5 秒刷新一次,保持订阅者数量最新。

你还可以通过向 wire:poll 传递值来指定在轮询间隔上触发的操作:

blade
<div wire:poll="refreshSubscribers">
    Subscribers: {{ $count }}
</div>

现在,组件上的 refreshSubscribers() 方法将每 2.5 秒调用一次。

时间控制

轮询的主要缺点是它可能占用大量资源。如果使用轮询的页面上有一千名访问者,则每 2.5 秒将触发一千个网络请求。

在这种情况下减少请求的最佳方法是简单地延长轮询间隔。

你可以通过将所需的持续时间附加到 wire:poll 来手动控制组件轮询的频率,如下所示:

blade
<div wire:poll.15s> <!-- 以秒为单位... -->

<div wire:poll.15000ms> <!-- 以毫秒为单位... -->

后台节流

为了进一步减少服务器请求,当页面处于后台时,Livewire 会自动节流轮询。例如,如果用户在不同的浏览器选项卡中保持页面打开,Livewire 将减少 95% 的轮询请求,直到用户重新访问该选项卡。

如果你想退出此行为并持续轮询,即使选项卡处于后台,也可以将 .keep-alive 修饰符添加到 wire:poll

blade
<div wire:poll.keep-alive>

视口节流

你可以采取的另一个仅在必要时轮询的措施是将 .visible 修饰符添加到 wire:poll.visible 修饰符指示 Livewire 仅在组件在页面上可见时轮询它:

blade
<div wire:poll.visible>

如果使用 wire:visible 的组件位于长页面的底部,它将不会开始轮询,直到用户将其滚动到视口中。当用户滚动离开时,它将再次停止轮询。