Директива wire:intersect⚓︎
Директива wire:intersect в Livewire позволяет выполнять действие при вхождении элемента в область видимости или выходе из неё. Это полезно для отложенной загрузки контента, запуска аналитики или создания взаимодействий на основе прокрутки.
Базовое использование⚓︎
Простейшая форма запускает действие при видимости элемента:
<div wire:intersect="loadMore">
<!-- Контент загружается при прокрутке в область видимости -->
</div>
Когда элемент входит в область видимости, будет вызвано действие loadMore на вашем компоненте.
События входа и выхода⚓︎
Вы можете указать, запускать ли действие при входе, выходе или обоих событиях:
<!-- Запускается при входе в область видимости (по умолчанию) -->
<div wire:intersect="trackView">...</div>
<!-- Запускается при входе в область видимости (явно) -->
<div wire:intersect:enter="trackView">...</div>
<!-- Запускается при выходе из области видимости -->
<div wire:intersect:leave="pauseVideo">...</div>
Модификаторы видимости⚓︎
Управляйте тем, какая часть элемента должна быть видна перед запуском:
<!-- Запуск при видимости любой части (по умолчанию) -->
<div wire:intersect="load">...</div>
<!-- Запуск при видимости половины -->
<div wire:intersect.half="load">...</div>
<!-- Запуск при полной видимости -->
<div wire:intersect.full="load">...</div>
<!-- Запуск при пользовательском пороге (0-100) -->
<div wire:intersect.threshold.25="load">...</div>
Отступ⚓︎
Добавьте отступ вокруг области видимости для запуска действия до/после входа элемента:
<!-- Запуск за 200 пикселей до входа в область видимости -->
<div wire:intersect.margin.200px="loadMore">...</div>
<!-- Использование отступа в процентах -->
<div wire:intersect.margin.10%="loadMore">...</div>
<!-- Разные отступы для каждой стороны (верх, право, низ, лево) -->
<div wire:intersect.margin.10%.25px.25px.25px="loadMore">...</div>
Однократный запуск⚓︎
Используйте модификатор .once, чтобы действие срабатывало только при первом пересечении:
<div wire:intersect.once="trackImpression">
<!-- Действие срабатывает только один раз, даже если прокрутка происходит несколько раз -->
</div>
Это особенно полезно для аналитики или отслеживания, когда вы хотите записать только первый раз, когда пользователь что-то видит.
Комбинирование модификаторов⚓︎
Вы можете комбинировать несколько модификаторов для создания точного поведения:
<!-- Загрузка при видимости половины, только один раз, с отступом 100 пикселей -->
<div wire:intersect.once.half.margin.100px="loadSection">
<!-- ... -->
</div>
Распространённые варианты использования⚓︎
Бесконечная прокрутка⚓︎
<?php
use Livewire\Component;
new class extends Component {
public $page = 1;
public $posts = [];
public function mount()
{
$this->loadPosts();
}
public function loadPosts()
{
$newPosts = Post::latest()
->skip(($this->page - 1) * 10)
->take(10)
->get();
$this->posts = array_merge($this->posts, $newPosts->toArray());
$this->page++;
}
};
?>
<div>
@foreach ($posts as $post)
<div>{{ $post['title'] }}</div>
@endforeach
<div wire:intersect="loadPosts">
Загрузка дополнительных постов...
</div>
</div>
Отложенная загрузка изображений⚓︎
<?php
use Livewire\Component;
new class extends Component {
public $imageLoaded = false;
public function loadImage()
{
$this->imageLoaded = true;
}
};
?>
<div>
@if ($imageLoaded)
<img src="/path/to/image.jpg" alt="Продукт">
@else
<div wire:intersect.once="loadImage" class="bg-gray-200 h-64">
<!-- Заполнитель -->
</div>
@endif
</div>
Отслеживание видимости⚓︎
<div wire:intersect:enter.once="trackView" wire:intersect:leave="trackLeave">
<!-- Отслеживание просмотров и уходов пользователей с этого контента -->
</div>
Сравнение с x-intersect в Alpine⚓︎
Если вы знакомы с Alpine.js, wire:intersect работает аналогично x-intersect, но запускает действия Livewire вместо выражений Alpine. Модификаторы и поведение разработаны так, чтобы быть знакомыми пользователям Alpine.
Справочник⚓︎
Модификаторы⚓︎
| Модификатор | Описание |
|---|---|
.once |
Запускать действие только при первом пересечении |
.half |
Запуск при видимости половины элемента |
.full |
Запуск при полной видимости элемента |
.threshold.[0-100] |
Запуск при пользовательском пороге видимости в процентах |
.margin.[значение] |
Добавить отступ вокруг области видимости (например, .margin.200px, .margin.10%) |