如何在渲染后将焦点设置在输入字段上?
2015-03-05
1090065
在组件渲染后,React 以什么方式将焦点设置在特定文本字段上?
文档似乎建议使用 refs,例如:
在渲染函数中,在我的输入字段上设置
ref="nameInput"
,然后调用:
this.refs.nameInput.getInputDOMNode().focus();
但我应该在哪里调用它?我试过几个地方,但无法让它工作。
3个回答
@Dhiraj 的回答是正确的,为了方便起见,您可以使用 autoFocus 属性让输入在安装时自动聚焦:
<input autoFocus name=...
请注意,在 jsx 中它是
autoFocus
(大写 F),与不区分大小写的普通旧 html 不同。
Brigand
2015-03-06
您应该在
componentDidMount
和
refs 回调
中执行此操作。类似这样的操作
componentDidMount(){
this.nameInput.focus();
}
class App extends React.Component{
componentDidMount(){
this.nameInput.focus();
}
render() {
return(
<div>
<input
defaultValue="Won't focus"
/>
<input
ref={(input) => { this.nameInput = input; }}
defaultValue="will focus"
/>
</div>
);
}
}
ReactDOM.render(<App />, document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.1/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.1/react-dom.js"></script>
<div id="app"></div>
Dhiraj
2015-03-06
挂载时聚焦
如果您只想在元素挂载(初始渲染)时聚焦该元素,只需使用 autoFocus 属性即可。
<input type="text" autoFocus />
动态聚焦
要动态控制聚焦,请使用通用函数来隐藏组件的实现细节。
React 16.8 + 函数组件 - useFocus 钩子
const FocusDemo = () => {
const [inputRef, setInputFocus] = useFocus()
return (
<>
<button onClick={setInputFocus} >
Focus
</button>
<input ref={inputRef} />
</>
)
}
const useFocus = () => {
const htmlElRef = useRef(null)
const setFocus = () => {htmlElRef.current && htmlElRef.current.focus()}
return [ htmlElRef, setFocus ]
}
React 16.3 + 类组件 - utilizeFocus
class App extends Component {
constructor(props){
super(props)
this.inputFocus = utilizeFocus()
}
render(){
return (
<>
<button onClick={this.inputFocus.setFocus}>
Focus
</button>
<input ref={this.inputFocus.ref}/>
</>
)
}
}
const utilizeFocus = () => {
const ref = React.createRef()
const setFocus = () => {ref.current && ref.current.focus()}
return {setFocus, ref}
}
Ben Carp
2019-01-12