是否可以使用focus()
方法聚焦div(或任何其他元素)?
我已将tabIndex设置为div元素:
<div ref="dropdown" tabIndex="1"></div>
当我点击它时,我可以看到它变得有针对性,但是,我正试图像这样动态聚焦元素:
setActive(state) {
ReactDOM.findDOMNode(this.refs.dropdown).focus();
}
或者像这样:
this.refs.dropdown.focus();
但是当触发事件时,组件不会获得焦点。我怎样才能做到这一点?我可以使用其他(非输入)元素吗?
编辑:
嗯,看来实际上可以做到:https://jsfiddle.net/69z2wepo/54201/
但这对我不起作用,这是我的完整代码:
class ColorPicker extends React.Component {
constructor(props) {
super(props);
this.state = {
active: false,
value: ""
};
}
selectItem(color) {
this.setState({ value: color, active: false });
}
setActive(state) {
this.setState({ active: state });
this.refs.dropdown.focus();
}
render() {
const { colors, styles, inputName } = this.props;
const pickerClasses = classNames('colorpicker-dropdown', { 'active': this.state.active });
const colorFields = colors.map((color, index) => {
const colorClasses = classNames('colorpicker-item', [`colorpicker-item-${color}`]);
return (
<div onClick={() => { this.selectItem(color) }} key={index} className="colorpicker-item-container">
<div className={colorClasses}></div>
</div>
);
});
return (
<div className="colorpicker">
<input type="text" className={styles} name={inputName} ref="component" value={this.state.value} onFocus={() => { this.setActive(true) }} />
<div onBlur={() => this.setActive(false) } onFocus={() => console.log('focus')} tabIndex="1" ref="dropdown" className={pickerClasses}>
{colorFields}
</div>
</div>
);
}
}
答案 0 :(得分:22)
每次设置状态时,React都会重新绘制组件,这意味着组件失去焦点。在这种情况下,如果要根据prop或state元素聚焦元素,则可以方便地使用componentDidUpdate
或componentDidMount
方法。
请记住,根据React Lifecycle文档,componentDidMount
只会在首次在屏幕上呈现组件后发生,并且在此调用中componentDidUpdate
将不会发生,然后对于每个新的setState
,forceUpdate
来电或接收新道具的组件将发生componentDidUpdate
来电。
componentDidMount() {
this.focusDiv();
},
componentDidUpdate() {
if(this.state.active)
this.focusDiv();
},
focusDiv() {
ReactDOM.findDOMNode(this.refs.theDiv).focus();
}
以下是您可以使用的JS fiddle。
答案 1 :(得分:3)
这是问题所在:
this.setState({ active: state });
this.refs.component.focus();
设置状态正在重新渲染你的组件而且调用是异步的,所以你 聚焦,它只是在它聚焦后立即重新渲染而你失去焦点。尝试使用setState
回调
this.setState({ active: state }, () => {
this.refs.component.focus();
});
答案 2 :(得分:0)
回答得有点晚了,但是事件处理程序不起作用的原因可能是因为您没有绑定函数,所以当您将其传递给函数时,在函数内部使用的“ this”将是未定义的,例如:“ this.selectItem (颜色)”
在构造函数中执行:
this.selectItem = this.selectItem.bind(this)
this.setActive = this.setActive.bind(this)
答案 3 :(得分:0)
import React from "react"
import ReactDOM from 'react-dom';
export default class DivFocusReactJs extends React.Component {
constructor(props) {
super(props)
this.state = {
}
}
componentDidMount() {
ReactDOM.findDOMNode(this.refs.divFocus).focus();
}
render() {
return (
<div tabIndex={1} ref="divFocus">
<p>Focusing div elements with React</p>
{/*your code here...*/}
</div>
)
}
}
答案 4 :(得分:-1)
这适用于我的情况
render: function(){
if(this.props.edit){
setTimeout(()=>{ this.divElement.focus() },0)
}
return <div ref={ divElement => this.divElement = divElement}
contentEditable={props.edit}/>
}
答案 5 :(得分:-1)
不确定这是否正确,但我发现这对我有用。
render() {
return <div ref='item' onLoad={() => this.refs.item.focus()}>I will have focus</div>
}