摘要:有些情況下,就需要通過阻止事件冒泡來實現預期的交互效果。下面是幾個簡單的比如有如下的代碼當我們點擊時,控制臺輸出結果這兩個事件都是合成事件,在點擊時,兩個事件會依次冒泡到由統一的事件監聽器處理。這也說明了,合成事件的只能阻止合成事件的冒泡。
在React中,我們可以在創建element的時候,傳入事件和處理函數,這些事件會被做為合成事件來處理,當然,有些時候,我們也需要定義原生事件,比如給document綁定事件。有些情況下,就需要通過阻止事件冒泡來實現預期的交互效果。下面是幾個簡單的demo
Demo比如有如下的代碼:
import React from "react" class Demo1 extends React.Component{ onClickInner(e){ console.log("inner div") } onClickOuter(e){ console.log("outer div") } render(){ return} }inner div
當我們點擊 inner div時,控制臺輸出結果:
inner div outer div
這兩個事件都是合成事件,在點擊時,兩個事件會依次冒泡到document,由統一的事件監聽器處理。如果希望阻止onClickOuter 觸發,可以在onClickInner內調用e.stopPropagation()。需要注意的是,這里的e是合成事件實例,調用stopPropagation 也只能阻止合成事件的冒泡。
假如我們將onClickOuter 通過原生事件來綁定:
class App extends React.Component { onClickInner(e) { e.stopPropagation(); console.log("inner div"); } onClickOuter(e) { console.log("outer div"); } componentDidMount() { this.outer.onclick = this.onClickOuter;// 通過DOM 0級綁定 } render() { return ((this.outer = ref)}>); } }123
雖然在onClickInner內調用了 e.stopPropagation, 但是原生事件還是會通過冒泡來觸發,而且會先于onClickInner, 控制臺輸出:
outer div inner div
這是因為onClickInner合成事件被觸發的時候,說明點擊事件已經通過冒泡傳遞到了document,在這個過程中,便會經過外層的div,進而觸發該原生事件。這也說明了,合成事件的stopPropagation只能阻止合成事件的冒泡。即使我們在這里通過e.nativeEvent獲取到原生事件并調用stopPropagation,也無濟于事,因為上面已經說了,在該合成事件被觸發的時候,已經冒泡到了document.
那么我們該通過什么方式來阻止原生事件onClickOuter被觸發呢:
既然在onClickInner處理不了,只能在onClickOuter內處理了:
onClickOuter(e) {// 這里e是原生事件 if(e.target && e.target.id === "inner"){ return ; } console.log("outer div"); }
如果我們將原生事件綁定在了document上:
class App extends React.Component { constructor(props) { super(props); // this.bindDocument(); } onClickInner(e) { console.log("inner div"); } componentDidMount() { this.bindDocument(); } bindDocument() { document.addEventListener("click", function(e) { console.log("document"); }); } render() { return (123); } }
上面代碼中,在組件掛載完畢后,再給document綁定click事件,這時候,React合成事件已經注冊完成,當點擊時,document上的click事件會依據綁定順序的先后依次執行,所以控制臺會輸出:
inner div document
如果希望阻止后綁定的事件觸發,可以在onClickInner內調用stopImmediatePropagation:
如果有多個相同類型事件的事件監聽函數綁定到同一個元素,當該類型的事件觸發時,它們會按照被添加的順序執行。如果其中某個監聽函數執行了 event.stopImmediatePropagation() 方法,則當前元素剩下的監聽函數將不會被執行。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/109310.html
摘要:因為阻止事件冒泡的行為只能用于合成事件中,沒法阻止原生事件的冒泡。同時的創建和冒泡是在原生事件冒泡到最頂層的之后的。淺析之事件系統一 上篇文章中,我們談到了React事件系統的實現方式,和在React中使用原生事件的方法,那么這篇文章我們來繼續分析下,看看React中合成事件和原生事件混用的各種情況。 上一個例子 在上篇文章中,我們舉了個例子。為了防止大家不記得,我們來看看那個例子的代...
摘要:文章涉及到的源碼是基于版本,雖然不是最新版本但是也不會影響我們對事件機制的整體把握和理解。總結本文主要是從整體流程上介紹了下事件觸發的過程。 showImg(https://segmentfault.com/img/bVbtvI3?w=1048&h=550); 前言 這是 react 事件機制的第四節-事件執行,一起研究下在這個過程中主要經過了哪些關鍵步驟,本文也是react 事件機制...
摘要:給注冊原生事件回調為統一的事件分發機制。根據元素唯一標識和事件類型從中取出回調函數返回帶有合成事件參數的回調函數總流程將上面的四個流程串聯起來。可見,回調函數是直接調用調用的,并沒有指定調用的組件,所以不進行手動綁定的情況下直接獲取到的是。 關于React事件的疑問 1.為什么要手動綁定this 2.React事件和原生事件有什么區別 3.React事件和原生事件的執行順序,可以混...
摘要:前言接下來讓我們進入新的章節漫談。正文一事件系統的事件系統事件系統符合標準,不存在任何兼容性問題,并且與原生的瀏覽器事件一樣有同樣的接口。所有的事件都自動綁定到最外層。組織事件冒泡的行為只適用于合成系統中,且沒辦法阻止原生事件冒泡。 前言 接下來讓我們進入新的章節:漫談React。本篇文章主要講React事件系統和表單操作。 正文 一:事件系統 1.react的事件系統react事件系...
閱讀 2984·2021-10-19 11:46
閱讀 978·2021-08-03 14:03
閱讀 2934·2021-06-11 18:08
閱讀 2904·2019-08-29 13:52
閱讀 2744·2019-08-29 12:49
閱讀 479·2019-08-26 13:56
閱讀 924·2019-08-26 13:41
閱讀 848·2019-08-26 13:35