点击空白处隐藏弹出层的原理是:在 document 上绑定事件来隐藏弹出层,这样点击任何元素的时候都会冒泡到 document 上,都会执行隐藏弹出层的功能。然后我们在不需要隐藏弹出层的元素上阻止冒泡即可。

class Select extends Component {
constructor(props) {
super(props); this.state = {
selected: props.list[0],
showList: false
}; this.showList = this.showList.bind(this);
} componentDidMount() {
// 在 document 上绑定点击事件,隐藏弹出层
document.addEventListener('click', (e) => {
this.setState({
showList: false
});
});
} showList(e) {
// 使用 react 的 e.stopPropagation 不能阻止冒泡,需要使用 e.nativeEvent.stopImmediatePropagation,这里我们对其进行封装,方便多次调用
this.stopPropagation(e);
this.setState({
showList: !this.state.showList
});
} selectList(i) {
const selected = this.props.list[i];
this.setState({
selected: selected,
showList: false
});
this.props.onChange(selected);
} // 封装后的阻止冒泡功能
stopPropagation(e) {
e.nativeEvent.stopImmediatePropagation();
} render() {
const { list } = this.props;
const { selected, showList } = this.state;
return (
<div className="hp-select">
<span className="hp-select__text">{selected.text}</span>
<span className="hp-select__btn" onClick={this.showList}></span>
<div
className="hp-select__list"
style={{ display: showList ? 'block' : 'none' }}
// 方便的调用封装冒泡功能来阻止冒泡
onClick={this.stopPropagation}
>
<ul>
{
list && list.map((item, i) => {
return <li key={item.value} onClick={this.selectList.bind(this, i)}>{item.text}</li>;
})
}
</ul>
</div>
</div>
);
}
}

最新文章

  1. entityframework学习笔记--007-实体数据建模基础之继承关系映射TPT
  2. 关于分页接口设计(下拉刷新上拉加载原理,解决page count请求重复数据的问题)
  3. Windows8.1画热度图 - 坑
  4. 1350. Primary Arithmetic
  5. Hibernate之Query接口的uniqueResult()方法
  6. webexam项目杂记
  7. IIS出现HTTP500.24错误
  8. JAVA——getter setter
  9. devexpress皮肤设置
  10. Django admin site(二)ModelAdmin methods
  11. win7 进程kill
  12. Android 检测SD卡应用
  13. Android 流媒体系列(二)
  14. &lt;taglib&gt;报错
  15. C#算法
  16. cf1136D. Nastya Is Buying Lunch(贪心)
  17. PTA 7-2 是否完全二叉搜索树(30 分) 二叉树
  18. SAP 创建 component
  19. Javascript的常见数据类型以及相应操作
  20. socket 断线重连

热门文章

  1. CSS【05】:CSS三大特性
  2. .NET Core 2.0 httpclient 请求卡顿解决方法
  3. Oracle三个配置文件详解
  4. .NET Core 如何上传文件及处理大文件上传
  5. ubuntu解压命令(转)
  6. Angular 学习笔记 (久久没有写 angular 常会忘记的小细节)
  7. ADC配置成定时器触发的启发
  8. vue实现tab切换功能
  9. 使用blas做矩阵乘法
  10. H264视频压缩算法