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>
);
},
});
ノート:
react-bootstrap.Input
クラスです。ボタンonclickハンドラーが実行されると、電子メール入力フィールドがフォーカスを取得しているはずですが、それは発生していません。 react-bootstrap入力フィールドクラスが、ラッピングdiv内の実際の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>
したがって、フォーカスがラッピングdivに適用され、それが拒否されるため、入力がフォーカスを取得していないように見えます(コンソールでdocument.activeElement
を使用してチェックします)。
問題は、実際のinput
要素にどのように焦点を合わせるかです。
注:少し関係ありませんが、ReactはautoFocus
プロパティを尊重します。これは、レンダリングの直後にフォーカスを設定する必要がある場合に役立ちます。それでも、プログラマティックの代わりにはなりません。仕方。
getInputDOMNode()
の代わりにgetDOMNode()
を試してください。
レンダリングで
<FormControl
type='text'
ref={(c)=>this.formControlRef=c}
/>
イベントハンドラー内
someHandler() {
ReactDOM.findDOMNode(this.formControlRef).focus();
}
findDOMNode
は推奨される方法ではなくなり、Facebookによって非推奨になる可能性があるため、autoFocus
プロパティ(Reactフレームワークではなく、フレームワークによって提供される)を使用する必要があります。 react-bootstrap)。これは、HTML autofocus
属性のクロスブラウザーポリフィルです。
<FormControl
autoFocus
...
/>
出典:
FormControlはinputRef
属性を提供します
それを試してみてください、
<FormControl inputRef={ref => { this.input = ref; }} />