Release Date: July 2025
Status: โ
Production Ready
Requires: PHP 8.2+ | Laravel 12+ | Livewire 4.2+ | livewire/blaze ^1.0
This release focuses exclusively on performance and rendering speed for applications that embed the table inside other Livewire components. No breaking changes to public configuration API.
#[Computed] Replaces Manual Hash CachingThe internal query result cache was previously implemented with a manual hash-based system using $cachedQueryResults, $cachedQueryHash, and generateQueryHash(). This has been completely replaced with Livewire 4's native #[Computed] attribute.
Before (v1.7.0):
protected ?Collection $cachedQueryResults = null;
protected ?string $cachedQueryHash = null;
protected function generateQueryHash(): string { ... }
public function getData(): mixed
{
$hash = $this->generateQueryHash();
if ($this->cachedQueryResults !== null && $this->cachedQueryHash === $hash) {
return $this->cachedQueryResults;
}
$this->cachedQueryHash = $hash;
return $this->cachedQueryResults = $this->buildQuery()->paginate($this->records);
}
public function invalidateQueryCache(): void
{
$this->cachedQueryResults = null;
$this->cachedQueryHash = null;
}
After (v1.8.0):
use Livewire\Attributes\Computed;
#[Computed]
public function tableData(): mixed
{
return $this->getData();
}
public function invalidateQueryCache(): void
{
unset($this->tableData);
}
Benefits:
unset() call[@island](https://github.com/island)(defer: true) Pagination FooterThe pagination section of the table view is now wrapped in a deferred Livewire island. This means the pagination controls render after the main table body, preventing them from blocking the initial paint.
[@island](https://github.com/island)(defer: true, name: 'pagination-footer')
[@placeholder](https://github.com/placeholder)
{{-- Bootstrap skeleton shown while island loads --}}
<div class="d-flex justify-content-between align-items-center p-3">
<div class="placeholder-glow col-4">
<span class="placeholder col-12 rounded"></span>
</div>
<div class="placeholder-glow col-5">
<span class="placeholder col-12 rounded"></span>
</div>
</div>
[@endplaceholder](https://github.com/endplaceholder)
{{-- actual pagination markup --}}
[@endisland](https://github.com/endisland)
The skeleton is immediately visible; the real pagination controls are streamed in by Livewire after the main response, keeping perceived load time low even on large datasets.
livewire/blaze ^1.0 โ Blade Component Compilationlivewire/blaze is now a hard dependency (moved from suggest to require).
Blaze intercepts the Blade compilation pipeline via earliestPreCompilationHook() and folds child Blade components into their parent templates at compile time. This eliminates the per-component rendering overhead that occurs when the table is embedded inside other Livewire components.
No configuration needed. Blaze activates automatically once installed. Set BLAZE_ENABLED=false in your .env to disable if needed.
Impact on table usage inside parent Livewire components:
<x-*> components inside the table's Blade view are compiled into the parent at build time__components::* hashed entries indicating Blaze-compiled components| Package | Before | After |
|---|---|---|
livewire/blaze |
suggest |
require ^1.0 |
Updated composer.json:
"require": {
"php": "*",
"livewire/livewire": "^4.0",
"illuminate/view": "*",
"livewire/blaze": "^1.0"
},
"suggest": {
"maatwebsite/excel": "For Excel export support (CSV/Excel download)",
"barryvdh/laravel-snappy": "For PDF export support"
}
| Removed | Reason |
|---|---|
$cachedQueryResults property |
Replaced by #[Computed] memoization |
$cachedQueryHash property |
No longer needed |
generateQueryHash() method |
No longer needed |
AftableComponentuse Livewire\Attributes\Async;
use Livewire\Attributes\Computed;
use Livewire\Attributes\Url;
Note on
#[Url]: The$queryStringarray syntax is still used instead of#[Url]on individual properties because those properties are defined in traits. Livewire 4's#[Url]attribute requires the property to be declared directly on the component class.
All features tested against a live demo with datasets of 10,000 / 2,000 / 15,000 / 50,000 records:
| Feature | Status |
|---|---|
| Initial page load (Employees โ 10,000 records) | โ |
Search (URL parameter ?search=โฆ) |
โ |
Sort (click column header, URL ?sortColumn=โฆ) |
โ |
| Clear search (ร button) | โ |
| Filter column selection | โ |
Filter value selection (URL ?filterValue=โฆ) |
โ |
| Clear filter | โ |
Pagination (URL ?page=2, @island defer skeleton visible then resolved) |
โ |
| Projects tab (2,000 records) | โ |
| Tasks tab (15,000 records) | โ |
| Timesheets tab (50,000 records, stress test) | โ |
| Foreach / Static Data mode | โ |
Custom Template ([@aftable](https://github.com/aftable) / [@endaftable](https://github.com/endaftable)) tab |
โ |
| Print Demo (popup blocked by browser = expected; alert shown) | โ |
| Performance Tests tab (4 categories rendered) | โ |
| Export dropdown (CSV & Excel options expand correctly) | โ |
| Column Visibility toggle (hide/show individual columns) | โ |
From v1.7.0 โ v1.8.0:
composer update to pull in livewire/blaze ^1.0 (now a required dependency).[@livewire](https://github.com/livewire)('aftable', [...]) syntax unchanged).livewire/blaze yourself, you can remove it from your own composer.json โ it is now managed by this package.BLAZE_ENABLED=false in .env if you want to opt out of Blaze compilation.How can I help you explore Laravel packages today?