У меня есть Code Sandbox здесь , который демонстрирует, что я хочу сделать.
Когда пользователь нажимает кнопку, открывается текстовый ввод и ему предоставляется фокус.
Для этого я использую ссылку и задаю ей фокус, что нормально:
//When user clicks button, show input
const handleClick = useCallback(() => {
setShowInput(true);
}, []);
useEffect(() => {
if (showInput && inputRef.current) {
inputRef.current.focus();
}
}, [showInput]);
Когда пользователь вкладывает из текстового поля, я хочуфокус, чтобы вернуться на эту кнопку.
В коде, который я имею здесь, я достигаю этого также с помощью ссылки и фокусировки на кнопке.
//When user exits input, unshow input
//Also, need to tab to button if it was a tab button press.
const handleInputBlur = useCallback(() => {
setShowInput(false);
if (buttonRef.current) {
buttonRef.current.focus();
}
}, []);
Однако проблема заключается в том, что если пользователь вместо этого использует свою мышь , чтобы нажать, скажем, другую кнопку, то фокус все равно отдается кнопке триггера.
То, что я хотел бы сделать, это определить некоторый порядок табуляции для этих компонентов, который будет:
TextField => Кнопка триггера => Другие кнопки
Однако я не хочу жестко кодировать индексы табуляции в моем компоненте, так как это, вероятно, не будет хорошо работать с приложением в целом?
Есть ли элегантное решение для реакции на это?