При использовании Tippy.js с большими наборами
элементов, необходимо учитывать производительность, управление
состояниями и оптимизацию рендеринга всплывающих подсказок. Для списков
с сотнями или тысячами элементов стандартная инициализация
tippy() на каждом элементе может привести к тормозам и
высокому потреблению памяти.
Создание подсказки только при необходимости значительно снижает нагрузку:
tippy.delegate(document.body, {
target: '.list-item',
content: (reference) => reference.getAttribute('data-tooltip'),
delay: 100,
interactive: true,
});
Пояснения:
delegate позволяет не инициализировать подсказки для
каждого элемента сразу.target определяет CSS-селектор элементов, для которых
будет работать делегирование.content вычисляется только в момент
появления подсказки.Это особенно эффективно для динамически обновляемых списков или элементов, загружаемых по скроллу.
Для списков с огромным количеством элементов, стоит комбинировать
Tippy.js с виртуальными списками (например,
Virtualized List):
import { FixedSizeList } from 'react-window';
const Row = ({ index, style }) => (
Элемент {index}
);
{Row}
delegate, чтобы не
создавать отдельные экземпляры на все 10 000 элементов.const tooltip = tippy(document.body, {
content: '',
trigger: 'manual',
placement: 'right',
});
document.body.addEventListener('mouseover', (e) => {
const target = e.target.closest('.list-item');
if (!target) return;
tooltip.setContent(target.getAttribute('data-tooltip'));
tooltip.show(target);
});
document.body.addEventListener('mouseout', () => tooltip.hide());
Минимизация событий на каждом элементе: Избегать
отдельного mouseover/mouseout на сотнях
элементов, вместо этого использовать событийное
делегирование через родительский контейнер.
Уменьшение количества DOM-элементов подсказки: Подсказка создается один раз, а её содержимое обновляется динамически.
Для больших списков часто требуется, чтобы подсказка оставалась открытой при наведении на неё:
tippy.delegate(document.body, {
target: '.list-item',
content: (ref) => ref.getAttribute('data-tooltip'),
interactive: true,
delay: [100, 200], // задержка показа и скрытия
maxWidth: 250
});
interactive: true позволяет удерживать подсказку при
перемещении курсора на сам tooltip.delay помогает предотвратить быстрое мерцание при
движении по списку.Для списков, которые обновляются через AJAX или WebSocket,
используется метод setContent:
const tooltip = tippy(document.body, { content: '', trigger: 'manual' });
function updateTooltipData(index, text) {
const element = document.querySelector(`.list-item[data-index="${index}"]`);
if (element._tippy) {
element._tippy.setContent(text);
}
}
| Параметр | Назначение |
|---|---|
delegate |
Делегирование подсказок на родительский контейнер |
content |
Функция динамического контента для каждого элемента |
interactive |
Позволяет удерживать подсказку при наведении |
delay |
Контроль времени появления и скрытия |
maxWidth |
Ограничение ширины подсказки для компактности |
trigger |
Управление событиями открытия (например, manual для
ручного контроля) |
Эти инструменты позволяют использовать Tippy.js с тысячами элементов без тормозов, обеспечивая при этом гибкость и динамичность интерфейса.