惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
博客园 - 聂微东
J
Java Code Geeks
Engineering at Meta
Engineering at Meta
Jina AI
Jina AI
D
Docker
B
Blog
S
SegmentFault 最新的问题
宝玉的分享
宝玉的分享
D
DataBreaches.Net
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Y
Y Combinator Blog
N
Netflix TechBlog - Medium
月光博客
月光博客
F
Fortinet All Blogs
爱范儿
爱范儿
H
Help Net Security
腾讯CDC
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
WordPress大学
WordPress大学
The Cloudflare Blog
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
U
Unit 42

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Livewire Polling, Events, and Lazy Loading: A Practical G...
Marcc Atayde · 2026-06-16 · via DEV Community

There's a common misconception that real-time features in Laravel require a WebSocket server, Redis pub/sub, and a tangle of JavaScript. For many use cases — live counters, notification badges, auto-refreshing tables, instant form feedback — Livewire gets you 90% of the way there with a fraction of the complexity. This article walks through three practical patterns: polling, browser and component events, and lazy loading, with working code you can drop into a real project today.

Why Livewire Before WebSockets?

WebSockets are powerful but carry real operational overhead: you need a persistent connection server (Laravel Reverb, Soketi, or Pusher), queue workers, broadcasting configuration, and frontend Echo setup. That's the right tool when you need true push from the server — think collaborative editing or live chat.

But a surprising number of "real-time" requirements are actually just near-real-time: a dashboard that refreshes every 5 seconds, a notification count that updates when the user navigates, a search box that queries as you type. Livewire handles all of these natively, and your stack stays simple.

Pattern 1: Polling for Live Data

Livewire's #[Poll] attribute (Livewire v3) is the quickest way to keep a component fresh. Here's a live order counter for an e-commerce admin panel:

<?php

namespace App\Livewire;

use App\Models\Order;
use Livewire\Attributes\Poll;
use Livewire\Component;

class PendingOrderCount extends Component
{
    #[Poll(5000)] // Poll every 5 seconds
    public int $count = 0;

    public function mount(): void
    {
        $this->count = Order::where('status', 'pending')->count();
    }

    public function render()
    {
        $this->count = Order::where('status', 'pending')->count();
        return view('livewire.pending-order-count');
    }
}

<!-- resources/views/livewire/pending-order-count.blade.php -->
<div class="flex items-center gap-2">
    <span class="text-sm text-gray-500">Pending Orders</span>
    <span class="rounded-full bg-red-500 px-2 py-0.5 text-xs font-bold text-white">
        {{ $count }}
    </span>
</div>

Polling fires an XHR request on the interval you define. For low-traffic admin tools this is perfectly fine. For high-traffic pages, push the interval to 30 seconds or cache the query result — avoid hammering your database on every tick.

Pausing Polls When the Tab Is Hidden

Livewire v3 respects the browser's Visibility API by default when you use keep-alive wisely, but you can make it explicit with Alpine:

<div
    x-data="{ visible: true }"
    x-on:visibilitychange.window="visible = !document.hidden"
    wire:poll.5000ms="refresh"
    x-bind:wire:poll.5000ms="visible ? 'refresh' : ''"
>
    <!-- content -->
</div>

This small change can meaningfully reduce server load when users have many tabs open.

Pattern 2: Component Events for Instant Feedback

Polling is pull-based. Events are push-based within the Livewire component tree — perfect for things like form submission confirmation, parent-child component communication, or triggering a toast notification.

Suppose you have a CreateTask form and a TaskList on the same page. When a task is saved, you want the list to refresh instantly without a page reload.

// App/Livewire/CreateTask.php
public function save(): void
{
    $this->validate([
        'title' => 'required|min:3',
    ]);

    Task::create(['title' => $this->title, 'user_id' => auth()->id()]);

    $this->reset('title');
    $this->dispatch('task-created'); // Fire the event
}

// App/Livewire/TaskList.php
use Livewire\Attributes\On;

class TaskList extends Component
{
    #[On('task-created')]
    public function refreshList(): void
    {
        // Livewire re-renders automatically; just declare the listener
    }

    public function render()
    {
        return view('livewire.task-list', [
            'tasks' => Task::where('user_id', auth()->id())
                          ->latest()
                          ->get(),
        ]);
    }
}

The #[On] attribute in Livewire v3 replaces the old $listeners array. Clean, declarative, and easy to trace. When CreateTask fires task-created, TaskList re-renders with fresh data — no JavaScript glue required.

Dispatching to the Browser (Alpine.js Integration)

Sometimes you want to trigger a JavaScript behaviour from a Livewire action — showing a toast, opening a modal, or triggering a CSS animation. Use dispatch with self scoped or dispatch a browser event:

// In your Livewire component
$this->dispatch('notify', message: 'Task created successfully!');

<!-- In your layout or a separate Alpine component -->
<div
    x-data="{ show: false, message: '' }"
    x-on:notify.window="message = $event.detail.message; show = true; setTimeout(() => show = false, 3000)"
>
    <div x-show="show" x-transition class="toast">
        <span x-text="message"></span>
    </div>
</div>

This is the TALL stack working as intended — Livewire handles server state, Alpine handles UI micro-interactions, no custom JavaScript files needed.

Pattern 3: Lazy Loading for Perceived Performance

Real-time UX isn't only about live data — it's also about making the page feel fast. Livewire's lazy attribute defers a component's first render until it enters the viewport, which is a significant win for dashboards with many expensive widgets.

<!-- In your Blade layout -->
<livewire:revenue-chart lazy />
<livewire:top-products lazy />
<livewire:recent-activity lazy />

While the component loads, you can show a placeholder using the placeholder method:

// App/Livewire/RevenueChart.php
public function placeholder()
{
    return <<<'HTML'
    <div class="h-64 animate-pulse rounded-xl bg-gray-100"></div>
    HTML;
}

This skeleton screen pattern dramatically improves First Contentful Paint scores and gives users immediate visual feedback that something is loading — which is itself a form of real-time UX.

Combining Patterns: A Live Dashboard Component

Here's how these three patterns fit together in practice. At HanzWeb, where we build a lot of client-facing dashboards, we typically structure admin pages like this:

  • Lazy load all heavy chart and stats components on mount
  • Poll lightweight counters every 10–30 seconds
  • Dispatch events from action components (approve, reject, create) to refresh adjacent list components instantly

This gives you a dashboard that loads fast, stays reasonably fresh without constant polling overhead, and responds instantly to user actions — without a single line of WebSocket configuration. If you're curious how this translates to real production interfaces, you can see our work for examples of Livewire-powered dashboards built for clients across different industries.

When to Move Beyond Livewire

Be honest about your requirements. Livewire polling is not the right tool when:

  • You need sub-second latency (live bidding, multiplayer, collaborative editing)
  • You need server-push without the user triggering any interaction
  • You have thousands of concurrent users all polling frequently

For those cases, reach for Laravel Reverb (the official first-party WebSocket server introduced in Laravel 11) with Laravel Echo on the frontend. But for most business applications — CRMs, admin panels, SaaS dashboards, booking systems — Livewire's built-in primitives are more than enough.

Conclusion

Real-time UX in Laravel doesn't have to mean infrastructure complexity. Livewire polling covers dashboard refresh scenarios, component events handle instant cross-component communication, and lazy loading makes your app feel fast before the data even arrives. Master these three patterns and you'll solve the majority of real-time requirements your clients will ever ask for — with code that's readable, testable, and maintainable by any Laravel developer on your team.