Этот компонент содержит 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>
);
}
Вы можете исправить это так:
<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
по поводу мероприятия. На мой взгляд, раздел в их документации, посвященный этому, был бы более полезен, чем прятать его за всплывающей подсказкой.
Вот рабочий пример.
Дмитрий, Спасибо за ответ. Я планирую использовать этот компонент для реализации панели поиска в стиле Twitter или Google. Вот мой план: когда пользователь фокусируется на поле ввода, всплывающее окно должно открыться, отображая старую историю поиска вместе со всеми новыми совпадающими поисковыми запросами ниже. Кроме того, когда пользователь выходит за пределы поля ввода или всплывающего окна, всплывающее окно должно закрыться и потерять фокус. Есть ли другой рекомендуемый способ добиться этого?
Ответ Рико правильный! Чтобы добавить больше контекста по умолчанию, правило a11y, Popover должен быть в фокусе при открытии, поскольку обычно содержит интерактивный компонент. Если вы хотите, чтобы он не «крал фокус» при должной доступности, возможно, рассмотрите возможность использования Tooltip или HoverCard.