javascript - 以编程方式导致 onBlur 在 react 中触发

标签 javascript reactjs ecmascript-6

我使用 onBlur 来关闭下拉菜单,但我还想处理其中渲染的 li 的点击处理程序,setState 在这里不起作用,当用户尝试再次打开下拉菜单时行为被破坏,试试吧这里:

http://jsfiddle.net/ur1rbcrz

我的代码:

toggleDropdown = () => {
    this.setState({
        openDropdown: !this.state.openDropdown
    })
  }

  render() {
    return (
      <div>
        <div tabIndex="0" onFocus={this.toggleDropdown} onBlur={this.toggleDropdown}>
          MyList
        <ul className={this.state.openDropdown ? 'show' : 'hide'}>
          <li>abc</li>
          <li>123</li>
          <li onClick={()=> this.setState({openDropdown:false})}>xyz</li> {/* not working */}
        </ul>
      </div>
      </div>
    );
  }

最佳答案

您的代码无法正常工作,因为即使您单击 li,一个带有 onBlur 事件的 div 容器仍然很专注。

我们将 ref 添加到您的列表容器中,之后我们可以调用 .blur()。我们在您的 onClick li 事件处理程序中使用它。

this.dropDownList.blur()

参见工作示例 jsfiddle .

或者运行这个片段:

class Hello extends React.Component {
  constructor() {
    super()
    this.state = {
      isDropdownVisible: false
    }
    
    this.toggleDropdown = this.toggleDropdown.bind(this);
  }
  
  toggleDropdown() {
  	this.setState({
    	isDropdownVisible: !this.state.isDropdownVisible
    })
  }
  
  render() {
    return (
      <div>
        <div 
        tabIndex="0" 
        ref={c => this.dropDownList = c}
        onFocus={this.toggleDropdown} 
        onBlur={this.toggleDropdown}>
          MyList
        <ul
        className={this.state.isDropdownVisible ? 'show' : 'hide'}>
          <li>abc</li>
          <li>123</li>
          <li onClick={() => this.dropDownList.blur()}>xyz</li> {/* not working */}
        </ul>
      </div>
      </div>
    );
  }
}

ReactDOM.render(
  <Hello initialName="World"/>,
  document.getElementById('container')
);
.hide {
  display: none
}

.show {
  display: block !important;
}

div:focus {
  border: 1px solid #000;
}

div:focus {
		outline: none;
	}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="container">
  <!-- This element's contents will be replaced with your component. -->
</div>

关于javascript - 以编程方式导致 onBlur 在 react 中触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44993669/

相关文章:

javascript - 更改 Twitter 推文按钮文本

reactjs - 有条件地从别处导入组件,如果它不存在

javascript - ECMAScript 6 箭头函数 - 参数周围的括号

javascript - 我们如何在 .setAttribute 中同时添加变换、旋转和缩放

javascript - 返回字符串而不是 null

javascript - 将输入文本拆分为单独的字段

javascript - 向下钻取(Highcharts)在 Angular 5 中不起作用

node.js - React 路由器、nginx、 Node 、静态文件

reactjs - 将 js 动态输入字段值 react 到状态

javascript - 如何将多个 javascript 类中的函数组合到一个对象中