首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有反应的聚焦div元素

有反应的聚焦div元素
EN

Stack Overflow用户
提问于 2016-08-26 21:31:07
回答 4查看 107.6K关注 0票数 30

是否可以使用focus()方法来聚焦div (或任何其他元素)?

我已经将tabIndex设置为div元素:

代码语言:javascript
复制
<div ref="dropdown" tabIndex="1"></div>

当我点击它的时候,我可以看到它变得很集中,但是,我试图动态地聚焦这个元素,比如:

代码语言:javascript
复制
setActive(state) {
  ReactDOM.findDOMNode(this.refs.dropdown).focus();
}

或者像这样:

代码语言:javascript
复制
this.refs.dropdown.focus();

但是,当事件被触发时,组件无法获得焦点。我该怎么做?是否还有其他(不是输入)元素可以用于此?

编辑:

嗯,看来这实际上是有可能的:https://jsfiddle.net/69z2wepo/54201/

但这对我没有用,这是我的全部代码:

代码语言:javascript
复制
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>
    );
  }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-26 23:14:27

每次设置状态时,都会重新绘制组件,这意味着组件失去了焦点。在这种情况下,如果您想要将元素集中在一个支柱或状态元素上,那么使用componentDidUpdatecomponentDidMount方法是很方便的。

请记住,根据React生命周期文档,只有在首次在屏幕上呈现组件之后才会发生componentDidMount,并且在此调用中不会发生componentDidUpdate,然后对于每个新的setStateforceUpdate调用或接收新道具的组件都会发生componentDidUpdate调用。

代码语言:javascript
复制
componentDidMount() {
  this.focusDiv();
},
componentDidUpdate() {
  if(this.state.active)
    this.focusDiv();
},
focusDiv() {
  ReactDOM.findDOMNode(this.refs.theDiv).focus();
}

这是一个你可以玩的JS小提琴

票数 30
EN

Stack Overflow用户

发布于 2016-08-26 23:01:00

这就是问题所在:

代码语言:javascript
复制
this.setState({ active: state });
this.refs.component.focus();

Set状态正在重新启用您的组件,并且调用是异步的,所以您正在聚焦,它只是在它聚焦之后立即重命名,然后您就失去了焦点。尝试使用setState回调

代码语言:javascript
复制
this.setState({ active: state }, () => {
   this.refs.component.focus();
});
票数 8
EN

Stack Overflow用户

发布于 2019-06-18 14:03:37

回答有点晚,但您的事件处理程序不起作用的原因可能是因为您没有绑定您的函数,因此当您将其传递为例如:“this.selectItem(颜色)”时,函数中使用的‘这个’将没有定义。

在构造函数中做:

代码语言:javascript
复制
this.selectItem = this.selectItem.bind(this)

this.setActive = this.setActive.bind(this)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39174887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档