开发者问题收集

如何在渲染后将焦点设置在输入字段上?

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