在组件呈现后将焦点设置在特定文本字段上的react方式是什么?
文档似乎建议使用 refs,例如:
ref="nameInput"
在渲染函数中设置我的输入字段,然后调用:
this.refs.nameInput.getInputDOMNode().focus();
但是我应该在哪里称呼它?我已经尝试了几个地方,但我无法让它工作。
在组件呈现后将焦点设置在特定文本字段上的react方式是什么?
文档似乎建议使用 refs,例如:
ref="nameInput"
在渲染函数中设置我的输入字段,然后调用:
this.refs.nameInput.getInputDOMNode().focus();
但是我应该在哪里称呼它?我已经尝试了几个地方,但我无法让它工作。
@Dhiraj 的回答是正确的,为方便起见,您可以使用 autoFocus props让输入在安装时自动聚焦:
<input autoFocus name=...
请注意,在 jsx 中,它autoFocus
(大写 F)与不区分大小写的普通旧 html 不同。
你应该在componentDidMount
而refs callback
不是这样做。像这样的东西
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>
如果您只想在元素挂载(初始渲染)时聚焦它,只需简单地使用 autoFocus 属性即可。
<input type="text" autoFocus />
要动态控制焦点,请使用通用函数来隐藏组件的实现细节。
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 ]
}
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}
}
从 React 0.15 开始,最简洁的方法是:
<input ref={input => input && input.focus()}/>
如果你只想在 React 中实现自动对焦,这很简单。
<input autoFocus type="text" />
如果您只想知道将该代码放在哪里,则答案在 componentDidMount() 中。
v014.3
componentDidMount() {
this.refs.linkInput.focus()
}
在大多数情况下,您可以将 ref 附加到 DOM 节点并完全避免使用 findDOMNode。
在此处阅读 API 文档:https : //facebook.github.io/react/docs/top-level-api.html#reactdom.finddomnode