使用refs.x.getDOMNode.focus设置焦点在一个react-bootstrap.Input字段上

11

JSX:

var Button = require("react-bootstrap").Button;
var Input = require("react-bootstrap").Input;
var MyClass = React.createClass({
        onclick: function () {
           this.refs.email.getDOMNode().focus();
           console.log('DOM element', this.refs.email.getDOMNode());
        }
        render: function () {
          return (
             <div>
                <Button onClick={this.onlick}>Login</Button>
                <Input ref='email' type='email' />
             </div>
            );
        },
    });  

注意:

  1. 该输入区域是一个react-bootstrap.Input类。
  2. getDOMNode().focus()的概念来自于Facebook React文档

当单击按钮时,应该将焦点设置在电子邮件输入区域,但实际上没有发生。我发现react-bootstrap的Input字段类在外围包装了真正的DOM输入区域。这是console.log的输出:

<div class="form-group" data-reactid=".1awy8d4e9kw.1.3.$=1$3:0.0.0.1.0">
  <input class="form-control" type="email" data-reactid=".1awy8d4e9kw.1.3.$=1$3:0.0.0.1.0.1:$input">
</div>

看起来输入框没有获取到焦点,因为焦点被应用在包裹的

上面了,导致被拒绝(我在控制台中使用document.activeElement进行检查)。

问题是,如何将焦点聚焦在真正的input元素上?

注意:有点无关紧要,但React尊重autoFocus属性。这在需要在渲染后立即设置焦点时非常有用。然而,它不能代替程序化的方法。

5个回答

23
尝试使用getInputDOMNode()替代getDOMNode()

1
需要注意的是,如果使用React 0.13,则应编写React.findDOMNode(),而在React 0.14之后,则应使用ReactDOM.findDOMNode() - Special Character

9
在渲染中
<FormControl
  type='text'
  ref={(c)=>this.formControlRef=c}
  />

在事件处理程序中

someHandler() {
  ReactDOM.findDOMNode(this.formControlRef).focus();
}

8

3

0

或者您可以使用原生JavaScript选择元素并设置焦点

document.getElementById("myInput").focus()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接