ここには、やりたいことを示すコード サンドボックスがあります。
ユーザーがボタンを押すと、テキスト入力が表示され、フォーカスが与えられます。
これを行うには、ref を使用してフォーカスを与えます。これで問題ありません。
//When user clicks button, show input
const handleClick = useCallback(() => {
setShowInput(true);
}, []);
useEffect(() => {
if (showInput && inputRef.current) {
inputRef.current.focus();
}
}, [showInput]);
ユーザーがテキスト フィールドからタブで移動したときに、フォーカスをそのボタンに戻す必要があります。
ここにあるコードでは、ref を使用してボタンにフォーカスを与えることでこれを実現しています。
//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 => トリガー ボタン => その他のボタン
ただし、タブ インデックスをコンポーネントにハード コードしたくありません。アプリケーション全体でうまく機能しない可能性があるためです。
これに対するエレガントな反応ソリューションはありますか?