在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,
});
});
}
複製代碼