在JavaScript中,事件的触发实质上是要通过三个阶段:浏览器
正由于事件在DOM的传递经历这样过程,为行为委托提供了可能,即行为委托的实质就是将子元素事件的处理委托给父级元素处理。bash
另外注意不要将React事件和DOM原生事件混用,譬如常见的sidebar的点击外部即隐藏的实现,阻止事件冒泡时,就要在真实DOM层面中去stopPropagation:ide
componentDidMount() {
// 点击body后隐藏sidebar
document.body.addEventListener('click', e => {
this.setState({
showSidebar: false,
});
});
// 点击sidebar自己时,阻止click事件冒泡到body,则sidebar不会隐藏
document.querySelector('.sidebar').addEventListener('click', e => {
e.stopPropagation();
})
}
componentWillUnmount() {
document.body.removeEventListener('click');
document.querySelector('.sidebar').removeEventListener('click');
}
复制代码
或者经过原生事件对象中的target进行条件判断:ui
componentDidMount() {
document.body.addEventListener('click', e => {
if (e.target && e.target.matches('div.sidebar')) {
return;
}
this.setState({
showSidebar: false,
});
});
}
复制代码