來源:https://www.cnblogs.com/lihuanqing/p/6295685.htmlhtml
只關注括號內問題的同窗,可直接跳轉到藍字部分。(標題起的有點大,其實只討論一個問題)react
兩個在React組件上綁定的事件,產生衝突後,使用e.stopPropagation(),阻止冒泡,便可防止事件衝突,毫無問題。瀏覽器
今天是踩了個React事件的坑,需求能夠簡化爲:點擊框體之外的部分則隱藏框體。最直接的想法,document上綁定個事件,設置控制顯示隱藏的state爲false,在框體上綁定個事件,阻止冒泡。這樣點擊框體內部就不會觸發document上的事件。測試
等寫完了,發現一個問題,沒法阻止冒泡,一搜索,好傢伙,好多人問e.stopPropagation()爲何沒法阻止事件冒泡,可是鮮有靠譜的回答。我第一個想法是原生事件和React事件產生衝突。明顯綁定原生事件是不符合React精神的,但我決定在探索真理的路上走下去了。this
爲了直觀的調試,把需求轉化爲,點擊框體內 alert(1)點擊框體外 alert(2)。spa
在document上綁定 alert(2),框體上(框體爲React組件,下同)綁定 alert(1),不作特殊處理,點擊框體內,根據事件冒泡,先彈 1 再彈 2 。這一點符合預期。此時e.stopPropagation()沒法阻止冒泡。調試
通過 Stack Overflow 解惑 e.nativeEvent.stopImmediatePropagation() 能夠完美實現預期。code
下面進入探索環節,經查閱資料,得出如下結論:component
測試代碼以下:htm
class Test extends React.Component{ componentDidMount(){ document.onclick=this.two; } one(e){ e.nativeEvent.stopImmediatePropagation(); alert(1) } two(){ alert(2) } render(){ return(<div style={{height:150,width:150,backgroundColor:"#000"}} onClick={this.one}/>) } } ReactDOM.render( <Test/>, document.getElementById("test") );
感謝且不只限於:
http://wiki.jikexueyuan.com/project/react/event-system.html
https://developer.mozilla.org/zh-CN/docs/Web/API/Event/stopImmediatePropagation