Ввод теряет фокус, когда Popover открывается в ShadCN

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

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

Ссылка на Песочницу

"use client";

import { Input } from "@/components/ui/input";
import {
  Popover,
  PopoverContent,
  PopoverTrigger,
} from "@/components/ui/popover";

export default function Searchbar() {
  return (
    <div className = "w-1/3">
      <Popover>
        <PopoverTrigger>
          <Input />
        </PopoverTrigger>
        <PopoverContent>Place content for the popover here.</PopoverContent>
      </Popover>
    </div>
  );
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
853
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете исправить это так:

<Popover>
  <PopoverTrigger>
    <Input />
  </PopoverTrigger>
  <PopoverContent onOpenAutoFocus = {(e) => e.preventDefault()}>
    Place content for the popover here.
  </PopoverContent>
</Popover>

Shadcn <Popover /> использует пользовательский интерфейс Radix под капотом. В документации Radix для <Popover /> рассказывается, как предотвратить фокусировку поповера, но это неочевидно. Вам нужно навести маленький значок «i» рядом с onOpenAutoFocus, чтобы увидеть, что вам нужно вызвать preventDefault по поводу мероприятия. На мой взгляд, раздел в их документации, посвященный этому, был бы более полезен, чем прятать его за всплывающей подсказкой.

Вот рабочий пример.

Ответ Рико правильный! Чтобы добавить больше контекста по умолчанию, правило a11y, Popover должен быть в фокусе при открытии, поскольку обычно содержит интерактивный компонент. Если вы хотите, чтобы он не «крал фокус» при должной доступности, возможно, рассмотрите возможность использования Tooltip или HoverCard.

Dimitrij Agal 03.05.2024 11:41

Дмитрий, Спасибо за ответ. Я планирую использовать этот компонент для реализации панели поиска в стиле Twitter или Google. Вот мой план: когда пользователь фокусируется на поле ввода, всплывающее окно должно открыться, отображая старую историю поиска вместе со всеми новыми совпадающими поисковыми запросами ниже. Кроме того, когда пользователь выходит за пределы поля ввода или всплывающего окна, всплывающее окно должно закрыться и потерять фокус. Есть ли другой рекомендуемый способ добиться этого?

Rayaan R 03.05.2024 20:32

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