Ограничения singleton режима

Singleton режим в Tippy.js позволяет объединить несколько всплывающих подсказок в один объект, чтобы управлять их поведением централизованно. Это удобно для создания единообразного пользовательского интерфейса, где только одна подсказка отображается одновременно, а остальные автоматически скрываются. Однако при его использовании есть ряд важных ограничений и особенностей, которые необходимо учитывать для корректной работы приложения.


1. Совместимость с типами контента

В singleton режиме все подсказки объединяются под одной конфигурацией. Это означает, что нельзя назначить уникальные настройки контента для каждой подсказки, которые зависят от динамических данных, если они отличаются от общей конфигурации singleton.

Например, если одна подсказка должна показывать текст, а другая – HTML-контент с кнопками, стандартный singleton не позволит автоматически поддерживать разный HTML для каждой подсказки.

Решение: использовать коллбэки onShow или onMount для динамического изменения содержимого, но при этом нужно быть осторожным, так как изменение содержимого влияет на все экземпляры singleton до скрытия следующей подсказки.


2. Ограничения по событиям

В singleton режиме обработчики событий, назначенные на отдельные tippy-экземпляры (onShow, onHide, onTrigger), могут работать нестабильно или не срабатывать так, как ожидалось. Это связано с тем, что singleton управляет жизненным циклом всех дочерних подсказок централизованно.

  • onShow для отдельной подсказки может не вызваться, если другая подсказка уже активна.
  • onHide вызывается не сразу при уходе курсора, а в момент, когда singleton решает скрыть подсказку.

Следствие: привязка сложной логики к отдельным событиям tippy в singleton может привести к неожиданному поведению.


3. Ограничения по позиционированию

Singleton использует единую конфигурацию placement, offset и popperOptions для всех объединённых подсказок.

  • Индивидуальные настройки позиции для каждой подсказки игнорируются.
  • Попытка назначить разные значения placement или offset для дочерних подсказок не даст результата – все подсказки будут следовать за параметрами singleton.

Решение: для уникального позиционирования каждой подсказки необходимо либо отказаться от singleton, либо динамически менять конфигурацию через методы setProps() при показе конкретной подсказки.


4. Ограничения по анимации

Все подсказки в singleton делят одну анимацию. Если требуется уникальная анимация для каждой подсказки (например, fade для одной и scale для другой), singleton не сможет это обеспечить.

  • Встроенные классы анимации и тайминги (duration, easing) применяются ко всем дочерним подсказкам.
  • Попытка указать разные анимации для отдельных подсказок не работает.

Обходной путь: использовать кастомные коллбэки onShow/onMount для временной замены класса анимации, но это усложняет поддержку и может привести к визуальным “рывкам”.


5. Проблемы с динамическими элементами

Если DOM-элементы, к которым привязаны tippy, динамически создаются или удаляются, singleton может вести себя нестабильно:

  • Подсказка может не отобразиться, если элемент был создан после инициализации singleton.
  • Удаление элемента из DOM не всегда корректно обновляет внутренний список дочерних tippy в singleton, что приводит к “мертвым” ссылкам и возможным ошибкам.

Рекомендация: пересоздавать singleton или обновлять его список через метод setInstances() при изменении элементов.


6. Ограничения по контролю через API

Singleton предоставляет методы для управления всеми подсказками одновременно (show(), hide(), disable(), enable()). Однако:

  • Индивидуальные вызовы методов дочерних tippy-экземпляров могут не работать, если singleton уже управляет их состоянием.
  • Прямое управление отдельной подсказкой требует отключения её из singleton или обхода через instance.unmount().

7. Ограничения по интеграции с сторонними плагинами

Tippy.js поддерживает плагины (например, followCursor, sticky), но в singleton:

  • Плагины, зависящие от индивидуального поведения подсказки, могут не работать корректно.
  • Например, followCursor применится только к общей конфигурации singleton, а не к каждой подсказке отдельно.

8. Практические рекомендации

  1. Использовать singleton только для подсказок с одинаковой конфигурацией, где важно ограничение одного активного тултипа.
  2. Для уникальных подсказок по контенту, позиции или анимации – лучше создать отдельные tippy-экземпляры.
  3. Если требуется динамическое поведение, использовать коллбэки, но учитывать, что все изменения влияют на глобальный singleton.
  4. Проверять работу с динамическими элементами и корректно обновлять список подсказок при изменении DOM.

Эти ограничения делают singleton мощным инструментом для централизованного управления подсказками, но одновременно накладывают строгие рамки на индивидуальные настройки каждой подсказки, которые нужно учитывать при разработке интерфейсов.