反应组件中的选项卡顺序?
Tab order in react components?
我有一个 Code Sandbox here 可以演示我想做什么。
当用户按下按钮时,将显示文本输入并获得焦点。
为此,我使用了一个 ref 并赋予它焦点,这很好:
//When user clicks button, show input
const handleClick = useCallback(() => {
setShowInput(true);
}, []);
useEffect(() => {
if (showInput && inputRef.current) {
inputRef.current.focus();
}
}, [showInput]);
当用户 tabs 离开文本字段时,我希望焦点回到该按钮上。
在我这里的代码中,我也是通过使用 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();
}
}, []);
但是,问题是如果用户改为 使用他们的鼠标 来点击其他按钮,那么焦点仍然给予触发按钮。
我希望能够为这些组件定义一些 Tab 键顺序,即:
TextField => 触发按钮 => 其他按钮
但是,我不想将选项卡索引硬编码到我的组件中,因为这可能无法很好地与整个应用程序配合使用?
有没有优雅的反应解决方案?
此处的最佳答案是,如果您希望 Tab 键顺序为 TextField => Trigger Button => Other Button,则让 HTML 按该顺序呈现。
然后您可以使用 CSS 更改视觉顺序。
.container {
display: flex;
border: solid 1px black;
}
button {
margin: 1em;
padding: 1em;
}
.order-1 {
order: 1;
}
.order-2 {
order: 2;
}
.order-3 {
order: 3;
}
.order-4 {
order: 4;
}
<div class = "container">
<button class ="order-4"> 1</button>
<button class = "order-2"> 2</button>
<button class = "order-3"> 3</button>
<button class ="order-1"> 4</button>
</div>
我喜欢 dwjohnston 的简单回答。如果需要更复杂的东西,我们可以考虑 react-tabindex 插件。
useTabIndex returns a value to pass to the tabIndex prop on elements
of your choosing. If wrapped in an active ancestor, that
tabIndex value will automatically be set to -1, making the elements
untabbable.
$ npm install react-tabindex
import { useTabIndex } from 'react-tabindex';
function ExampleButton() {
const tabIndex = useTabIndex();
return <button tabIndex={tabIndex}>Click here!</button>;
}
我有一个 Code Sandbox here 可以演示我想做什么。
当用户按下按钮时,将显示文本输入并获得焦点。
为此,我使用了一个 ref 并赋予它焦点,这很好:
//When user clicks button, show input
const handleClick = useCallback(() => {
setShowInput(true);
}, []);
useEffect(() => {
if (showInput && inputRef.current) {
inputRef.current.focus();
}
}, [showInput]);
当用户 tabs 离开文本字段时,我希望焦点回到该按钮上。
在我这里的代码中,我也是通过使用 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();
}
}, []);
但是,问题是如果用户改为 使用他们的鼠标 来点击其他按钮,那么焦点仍然给予触发按钮。
我希望能够为这些组件定义一些 Tab 键顺序,即:
TextField => 触发按钮 => 其他按钮
但是,我不想将选项卡索引硬编码到我的组件中,因为这可能无法很好地与整个应用程序配合使用?
有没有优雅的反应解决方案?
此处的最佳答案是,如果您希望 Tab 键顺序为 TextField => Trigger Button => Other Button,则让 HTML 按该顺序呈现。
然后您可以使用 CSS 更改视觉顺序。
.container {
display: flex;
border: solid 1px black;
}
button {
margin: 1em;
padding: 1em;
}
.order-1 {
order: 1;
}
.order-2 {
order: 2;
}
.order-3 {
order: 3;
}
.order-4 {
order: 4;
}
<div class = "container">
<button class ="order-4"> 1</button>
<button class = "order-2"> 2</button>
<button class = "order-3"> 3</button>
<button class ="order-1"> 4</button>
</div>
我喜欢 dwjohnston 的简单回答。如果需要更复杂的东西,我们可以考虑 react-tabindex 插件。
useTabIndex returns a value to pass to the tabIndex prop on elements of your choosing. If wrapped in an active ancestor, that tabIndex value will automatically be set to -1, making the elements untabbable.
$ npm install react-tabindex
import { useTabIndex } from 'react-tabindex';
function ExampleButton() {
const tabIndex = useTabIndex();
return <button tabIndex={tabIndex}>Click here!</button>;
}