首頁 > web前端 > 前端問答 > react的合成事件如何形容

react的合成事件如何形容

青灯夜游
發布: 2022-12-15 19:39:29
原創
2294 人瀏覽過

React合成事件是React模擬原生DOM事件所有能力的事件對象,即瀏覽器原生事件的跨瀏覽器包裝器;它根據W3C規範來定義合成事件,相容於所有瀏覽器,擁有與瀏覽器原生事件相同的介面。在React中,所有事件都是合成的,不是原生DOM事件,但可以透過「e.nativeEvent」屬性來取得DOM事件。

react的合成事件如何形容

本教學操作環境:Windows7系統、react18版、Dell G3電腦。

一、合成事件是什麼

React基於瀏覽器的事件機製本身實作了一套事件機制,包括事件註冊、事件的合成、事件冒泡、事件派發等

#在React中這套事件機制稱為合成事件

#合成事件(SyntheticEvent)

React 合成事件(SyntheticEvent)是React 模擬原生DOM 事件所有能力的事件對象,即瀏覽器原生事件的跨瀏覽器包裝器。它根據 W3C 規格 來定義合成事件,相容於所有瀏覽器,並擁有與瀏覽器原生事件相同的介面。例如

const button = <button onClick={handleClick}>按钮</button>
登入後複製

在 React 中,所有事件都是合成的,不是原生 DOM 事件,但可以透過 e.nativeEvent 屬性取得 DOM 事件。例如:

const handleClick = (e) => console.log(e.nativeEvent);;
const button = <button onClick={handleClick}>按钮</button>
登入後複製

從上面可以看到React事件和原生事件也非常的相似,但也有一定的差異:

  • 事件名稱命名方式不同

// 原生事件绑定方式
<button onclick="handleClick()">按钮命名</button>
      
// React 合成事件绑定方式
const button = <button onClick={handleClick}>按钮命名</button>
登入後複製
  • 事件處理函數書寫不同

// 原生事件 事件处理函数写法
<button onclick="handleClick()">按钮命名</button>
      
// React 合成事件 事件处理函数写法
const button = <button onClick={handleClick}>按钮命名</button>
登入後複製

雖然onclick看似綁定到DOM元素上,但實際上並不會把事件代理函數直接綁定到真實的節點上,而是把所有的事件綁定到結構的最外層,使用一個統一的事件去監聽。 【相關推薦:Redis影片教學程式設計教學

這個事件監聽器上維持了一個映射來保存所有元件內部的事件監聽和處理函數。當元件掛載或卸載時,只是在這個統一的事件監聽器上插入或刪除一些物件。

當事件發生時,首先被這個統一的事件監聽器處理,然後在映射裡找到真正的事件處理函數並呼叫。這樣做簡化了事件處理和回收機制,效率也大大提升。

二、執行順序

關於React合成事件與原生事件執行順序,可以看看下面一個例子:

import  React  from &#39;react&#39;;
class App extends React.Component{

  constructor(props) {
    super(props);
    this.parentRef = React.createRef();
    this.childRef = React.createRef();
  }
  componentDidMount() {
    console.log("React componentDidMount!");
    this.parentRef.current?.addEventListener("click", () => {
      console.log("原生事件:父元素 DOM 事件监听!");
    });
    this.childRef.current?.addEventListener("click", () => {
      console.log("原生事件:子元素 DOM 事件监听!");
    });
    document.addEventListener("click", (e) => {
      console.log("原生事件:document DOM 事件监听!");
    });
  }
  parentClickFun = () => {
    console.log("React 事件:父元素事件监听!");
  };
  childClickFun = () => {
    console.log("React 事件:子元素事件监听!");
  };
  render() {
    return (
      <div ref={this.parentRef} onClick={this.parentClickFun}>
        <div ref={this.childRef} onClick={this.childClickFun}>
          分析事件执行顺序
        </div>
      </div>
    );
  }
}
export default App;
登入後複製

輸出順序為:

原生事件:子元素 DOM 事件监听! 
原生事件:父元素 DOM 事件监听! 
React 事件:子元素事件监听! 
React 事件:父元素事件监听! 
原生事件:document DOM 事件监听!
登入後複製

可以得出以下結論:

  • React 所有事件都掛載在document 物件上

  • 當真實DOM元素觸發事件,會冒泡到document 物件後,再處理React 事件

  • 所以會先執行原生事件,然後處理React 事件

  • 最後真正執行document 上掛載的事件

對應程序如圖所示:

react的合成事件如何形容

##所以想要阻止不同時間段的冒泡行為,對應使用不同的方法,對應如下:

  • 阻止合成事件間的冒泡,用e.stopPropagation()

  • 阻止合成事件與最外層document 上的事件間的冒泡,用e.nativeEvent.stopImmediatePropagation()

  • 阻止合成事件與除最外層document上的原生事件上的冒泡,透過判斷e.target來避免

  • document.body.addEventListener(&#39;click&#39;, e => {   
        if (e.target && e.target.matches(&#39;div.code&#39;)) {  
            return;    
        }    
        this.setState({   active: false,    });   }); 
    }
    登入後複製

    #三、總結

    React事件機制總結如下:

    • React 上註冊的事件最終會綁定在document這個DOM 上,而不是React 元件對應的DOM(減少記憶體開銷就是因為所有的事件都綁定在document 上,其他節點沒有綁定事件)

    • React 本身實作了一套事件冒泡機制,所以這就是為什麼我們event.stopPropagation()無效的原因。

    • React 透過佇列的形式,從觸發的元件向父元件回溯,然後呼叫他們JSX 中定義的callback

    • React 有一套自己的合成事件SyntheticEvent

    (學習影片分享:

    程式設計基礎影片

    以上是react的合成事件如何形容的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板