如何为具有嵌套输入字段的div实现onBlur / onFocus?

时间:2017-07-06 15:24:10

标签: javascript reactjs nested onblur onfocus

<div>和几个嵌套<input>。每次用户点击其中一个onBlur时,<input>都会触发 当我在onBlur内点击某些内容时div会发生这种情况,这有点令人沮丧。经过一个小时的搜索,我仍然无法找到任何好的解决方案 这段代码展示了我所谈论的内容:

class Thing extends React.Component {
  handleBlur(e) {
    console.log('blur');
  }
  handleFocus(e) {
    console.log('focus');
  }
  render() {
    return (
      <div onFocus={this.handleFocus} onBlur={this.handleBlur} tabIndex="1">
        <div>
          <input type="text" value="Hello," />
        </div>
        <div>
          <input type="text" value="Thing" />
        </div>
      </div>
    );
  }
}

您可以使用代码over here 但是,我的最终目标是让this thing正常工作。

3 个答案:

答案 0 :(得分:1)

您可能希望忽略额外的模糊事件。

handleBlur(e) {
   if (e.target.tagName == "INPUT") {
      return;
   }
   console.log('blur');
}
handleFocus(e) {
   console.log('focus');
}

答案 1 :(得分:1)

如何将输入分成单个独立的组件?

app.js

class Thing extends React.Component {
  handleBlur(val, event) {
    console.log(val, event);
  }
  handleFocus(val, event) {
    console.log(val, event);
  }

  data = ['Hello, ', 'Thing'];

  render() {
    return (
      <div tabIndex="1">
        {this.data.map((v, i) => <Input value={v} key={i} onFocus={this.handleFocus} onBlur={this.handleBlur} />)}
      </div>
    );
  }
}

Input.js

import React from 'react';

export class Input extends React.PureComponent {

  handleF = () => {
    this.props.onFocus(this.props.value, 'focus');
  }

  handleB = () => {
    this.props.onBlur(this.props.value, 'blur');
  }

  render() {
    return <input type="text" onFocus={this.handleF} onBlur={this.handleB} />;
  }
}

export default Input;

https://codesandbox.io/s/J6o5Ey9Jg

答案 2 :(得分:1)

这是来自以上OP的评论,他发现了以下对他(以及现在对我)都有效的解决方案,并将其发布在了评论中。我在这里将其重新发布给其他可能不希望通过评论进行挖掘的人。

基本上,我只是检查每个模糊事件,是否e.relativeTarget在parentElement链中的任何位置都有e.currentTarget。

https://codesandbox.io/s/vo2opP0Nn?file=/index.js