为什么我不能使用 React refs 专注于某些元素?
Why can't I focus on certain elements using react refs?
我有一个奇怪的案例,我有一个表单元素的引用列表,包括按钮、不同类型的输入等。
然后我创建了一个错误摘要,当点击它时会自动聚焦,因此也会滚动到需要注意的元素。这对 input[type="text"] 和 textareas 非常有效,但是 input[type="file"] 和按钮(类型按钮)无法正常工作。然而,这是奇怪的部分,如果我点击上面的一个元素然后手动向下移动,将焦点放在该元素上。然后焦点功能再次开始工作。
我只是通过使用 imperativeHandle 调用公开的函数来获取所有引用。 refs 是这样创建的:const fileInput = createRef<HTMLInputElement>();
并分配给输入元素。代码很简单,这是一个已知问题吗?
提前致谢。
编辑:
尝试复制错误,并用这个简单的代码遇到同样的问题:
import React, { createRef } from 'react';
import logo from './logo.svg';
import './App.css';
function App() {
const textRef = createRef<HTMLInputElement>();
const textAreaRef = createRef<HTMLTextAreaElement>();
const fileRef = createRef<HTMLInputElement>();
const buttonRef = createRef<HTMLButtonElement>();
return (
<div className="App">
<div>
<input type="text" ref={textRef} />
</div>
<div>
<textarea ref={textAreaRef} ></textarea>
</div>
<div>
<input type="file" ref={fileRef}/>
</div>
<div>
<button ref={buttonRef}>Button</button>
</div>
Links:
<div>
<button onClick={() => {
textRef.current?.focus();
}}>Text</button>
</div>
<div>
<button onClick={() => {
textAreaRef.current?.focus();
}}>TextArea</button>
</div>
<div>
<button onClick={() => {
fileRef.current?.focus();
}}>File</button>
</div>
<div>
<button onClick={() => {
buttonRef.current?.focus();
}}>Button</button>
</div>
</div>
);
}
export default App;
使用scrollTo时也有同样的问题。
编辑 2:
尝试将 preventDefault 添加到 onclick 函数,但没有任何效果。使用键盘导航并使用 space 或 enter 按下项目似乎完美无缺,但在使用光标单击时却不是。
您的代码示例似乎可以正常工作。
当您单击焦点按钮时,焦点将移动到适当的输入。默认情况下,只有当用户代理通过试探法确定焦点应该在元素上变得明显时,才会显示“焦点环”。如果您使用键盘导航到对焦按钮并按 Enter,您将在 file
输入上看到“对焦环”。
您可以使用 :focus
pseudo class to create style indicator that will be visible any time the target is focused. You should also read about the :focus-visible
伪 class,因为它可以帮助您了解默认情况下焦点指示器的工作方式。
您遇到 scrollTo
的问题是因为所有内容都可以显示在视图中而无需滚动。如果您为输入周围的每个 div
添加一些高度,使文档比浏览器上的视图长,调用 scrollTo
将滚动到正确的输入。
我有一个奇怪的案例,我有一个表单元素的引用列表,包括按钮、不同类型的输入等。 然后我创建了一个错误摘要,当点击它时会自动聚焦,因此也会滚动到需要注意的元素。这对 input[type="text"] 和 textareas 非常有效,但是 input[type="file"] 和按钮(类型按钮)无法正常工作。然而,这是奇怪的部分,如果我点击上面的一个元素然后手动向下移动,将焦点放在该元素上。然后焦点功能再次开始工作。
我只是通过使用 imperativeHandle 调用公开的函数来获取所有引用。 refs 是这样创建的:const fileInput = createRef<HTMLInputElement>();
并分配给输入元素。代码很简单,这是一个已知问题吗?
提前致谢。
编辑: 尝试复制错误,并用这个简单的代码遇到同样的问题:
import React, { createRef } from 'react';
import logo from './logo.svg';
import './App.css';
function App() {
const textRef = createRef<HTMLInputElement>();
const textAreaRef = createRef<HTMLTextAreaElement>();
const fileRef = createRef<HTMLInputElement>();
const buttonRef = createRef<HTMLButtonElement>();
return (
<div className="App">
<div>
<input type="text" ref={textRef} />
</div>
<div>
<textarea ref={textAreaRef} ></textarea>
</div>
<div>
<input type="file" ref={fileRef}/>
</div>
<div>
<button ref={buttonRef}>Button</button>
</div>
Links:
<div>
<button onClick={() => {
textRef.current?.focus();
}}>Text</button>
</div>
<div>
<button onClick={() => {
textAreaRef.current?.focus();
}}>TextArea</button>
</div>
<div>
<button onClick={() => {
fileRef.current?.focus();
}}>File</button>
</div>
<div>
<button onClick={() => {
buttonRef.current?.focus();
}}>Button</button>
</div>
</div>
);
}
export default App;
使用scrollTo时也有同样的问题。
编辑 2: 尝试将 preventDefault 添加到 onclick 函数,但没有任何效果。使用键盘导航并使用 space 或 enter 按下项目似乎完美无缺,但在使用光标单击时却不是。
您的代码示例似乎可以正常工作。
当您单击焦点按钮时,焦点将移动到适当的输入。默认情况下,只有当用户代理通过试探法确定焦点应该在元素上变得明显时,才会显示“焦点环”。如果您使用键盘导航到对焦按钮并按 Enter,您将在 file
输入上看到“对焦环”。
您可以使用 :focus
pseudo class to create style indicator that will be visible any time the target is focused. You should also read about the :focus-visible
伪 class,因为它可以帮助您了解默认情况下焦点指示器的工作方式。
您遇到 scrollTo
的问题是因为所有内容都可以显示在视图中而无需滚动。如果您为输入周围的每个 div
添加一些高度,使文档比浏览器上的视图长,调用 scrollTo
将滚动到正确的输入。