HeadlessUI React, как определить элемент с фокусом в данный момент?

Я пытаюсь создать забавный вариант использования:

У меня есть диалог HeadlessUI, внутри этого диалога есть компонент HeadlessUI Menu в качестве вложенного дочернего элемента, я хочу вызвать меню с помощью сочетания клавиш

Мне удалось вызвать диалог с помощью:

      // I took the useWindowEvent from the headlessUI code
useWindowEvent("keydown", (event) => {
    if (event.key === "p") {
      event.preventDefault()
      event.stopPropagation()
      selectorRef.current?.click()
    }
  })

и в моем компоненте меню:

      // My react component forwardRefs to the trigger button
export const ProjectSelector = forwardRef(
... some other component code
<Menu.Button ref={ref} as="div">
... other code

Это отлично работает для запуска меню, но в меню также есть строка поиска, поэтому всякий раз, когда я нажимаю клавишу p, слушатель запускается снова и программно закрывает меню

Я заглянул внутрь кода headlessUI, пытаясь понять код ловушки фокуса, но он у меня над головой, есть ли способ определить, имеет ли родительский диалог фокус? таким образом я могу просто игнорировать нажатие клавиши, если фокус находится в меню :)

Обходной путь:

При написании вопроса я наткнулся на обходной путь ... он не очень красивый, так что, возможно, кто-то может придумать лучшее решение:

        // I'm pretty sure I'm doing everything wrong in here
  // but I couldn't find another way to remotely trigger and keep focus on the menu component
  useWindowEvent("keydown", (event) => {
    if (
      event.key === "p" &&
      document.activeElement?.getAttribute("role") !== "menu" &&
      document.activeElement?.tagName !== "INPUT"
    ) {
      event.preventDefault()
      event.stopPropagation()
      selectorRef.current?.click()
    }
  })

0 ответов

Другие вопросы по тегам