我在这里有一个代码沙箱,它演示了我想要做什么。
当用户按下按钮时,会显示文本输入并获得焦点。
为此,我使用 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 => 触发按钮 => 其他按钮
但是,我不想将选项卡索引硬编码到我的组件中,因为这可能无法很好地与整个应用程序一起使用?
对此有优雅的反应解决方案吗?