BACK
Use casesSingle vs double click — select или open
Use cases · 55

Single vs double click — select или open

Паттерн

Десктопный UI с таблицей: один клик — выбрать строку, двойной клик — открыть карточку. Два разных действия по одной и той же кнопке мыши. Нужно дождаться короткой паузы, чтобы понять — это был single или double click.

Какую проблему решаем

Если выполнять select сразу на первый click — то при double click сначала сработает select, потом откроется карточка. Получается визуальный мусор: подсветка строки + переход. Императивные setTimeout-флаги усложняют логику и легко ломаются.

Операторы и зачем они нужны

  • buffer(closingNotifier$) — копит clicks, пока не сработает notifier.
  • debounceTime на том же click stream — создаёт closing notifier через короткую паузу.
  • map(clicks => clicks.length) — считаем clicks в буфере.
  • filter(count => count > 0) — отбрасываем пустые буферы.

Подводные камни

  • Если действие срабатывает сразу на click — double click обязательно сначала вызовет select.
  • throttleTime здесь не подходит — он не различает количество кликов в окне.
  • Длинное окно (300мс+) делает одиночный клик медленным. Пользователь не должен ждать решения системы.

Что в итоге получаем

Одиночный клик после паузы → select. Два быстрых клика → open. Никаких лишних промежуточных действий.

script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...