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

IT技术 javascript reactjs
2021-01-25 19:08:56

在组件呈现后将焦点设置在特定文本字段上的react方式是什么?

文档似乎建议使用 refs,例如:

ref="nameInput"在渲染函数中设置我的输入字段,然后调用:

this.refs.nameInput.getInputDOMNode().focus(); 

但是我应该在哪里称呼它?我已经尝试了几个地方,但我无法让它工作。

6个回答

@Dhiraj 的回答是正确的,为方便起见,您可以使用 autoFocus props让输入在安装时自动聚焦:

<input autoFocus name=...

请注意,在 jsx 中,它autoFocus(大写 F)与不区分大小写的普通旧 html 不同。

请注意,在JSX其自动˚F OCUS(大写F)不像普通的旧的HTML是不区分大小写。
2021-03-15 19:08:56
不仅“为了方便”,而且如果您的组件是功能组件。
2021-03-23 19:08:56
我发现 autoFocus 仅适用于第一页渲染。请参阅codepen.io/ericandrewlewis/pen/PbgwqJ?editors=1111输入应在 3 秒后聚焦。
2021-04-06 19:08:56
+1 此方法。值得一提的是,这不仅仅使用了 HTML5 的不可靠autofocus属性,它实际上是在 DOM 挂载中使用的focus()react-dom所以它非常可靠。
2021-04-07 19:08:56
非常好,经过长时间无果的搜索后到这里:) 仅供参考 - 我最终使用了 React.DOM.input({ type: 'text', defaultValue: content, autoFocus: true, onFocus: function(e) {e.target.选择();} })
2021-04-09 19:08:56

你应该在componentDidMountrefs 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>

警告:不推荐使用 React.findDOMNode。请改用 require('react-dom') 中的 ReactDOM.findDOMNode。
2021-03-16 19:08:56
这是正确的答案,但它对我不起作用,因为我的组件首先不渲染任何内容,直到单击另一个按钮。这意味着它已经被挂载了,所以我不得不添加 this.refs.nameInput.getDOMNode().focus(); 在 componentDidUpdate 而不是 componentDidMount 中。
2021-03-18 19:08:56
为什么我们不只是使用 ref={(input) => { input.focus()}}这个解决方案对我来说很好。
2021-03-22 19:08:56
为什么,当 element.focus() 被调用时,它是否将光标放在输入的开头?我在我的应用程序中看到了这个(我认为是一个)错误,在 chrome 中,实际上在 <textarea> 中,现在在这里检查您的演示,它是一样的。
2021-03-30 19:08:56
@HuwDavies 我猜你会元素使用ref 回调属性来做到这一点<input>就像是<input ref={ (component) => ReactDOM.findDOMNode(component).focus() } />
2021-04-10 19:08:56

专注于坐骑

如果您只想在元素挂载(初始渲染)时聚焦它,只需简单地使用 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 + 类组件——利用焦点

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 Hooks 的正确方法。极好的!它不会在 TypeScript 中按原样进行类型检查,而是一种(丑陋的)使其工作的方式:(1)(htmlElRef.current as any).focus()和(2)return {htmlElRef, setFocus}而不是数组。
2021-03-14 19:08:56
@BenCarp小建议为挂钩,可能会更好地把set像第二位置const [inputRef, setInputFocus] = useFocus()这更符合 useState 。首先是对象,然后是该对象的 setter
2021-03-20 19:08:56
这里是useFocus用 Typescript 写的。gist.github.com/carpben/de968e377cbac0ffbdefe1ab56237573
2021-03-29 19:08:56
@Rubanov,谢谢。我根据您的建议调整了代码。
2021-04-09 19:08:56
@AhmedFasih,我知道你在说什么,但我认为这超出了这个线程的范围。如果您返回一个对象,那么控制变量的名称就会变得更加困难,如果您想将其useFocus用于多个元素,这可能会成为一个问题
2021-04-10 19:08:56

从 React 0.15 开始,最简洁的方法是:

<input ref={input => input && input.focus()}/>
@JaeGeeTee 在安装组件和/或卸载组件之前它为空(我不确定是哪种情况)。
2021-03-16 19:08:56
在我的情况下不起作用(使用Ant Design输入组件)
2021-03-19 19:08:56
问题,什么时候输入是假的?我指的是箭头函数中的表达式。
2021-03-26 19:08:56
唯一的问题是它将输入集中在任何可能不需要的重新渲染上。
2021-03-27 19:08:56
这也处理初始渲染之外的场景,而仅使用 autoFocus 则不会。
2021-04-07 19:08:56

如果你只想在 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

记住要大写F(注意自己和他人,而不是回答者)。
2021-03-12 19:08:56