React的事件

React事件系統

事件處理程序通過 合成事件(SyntheticEvent)的實例傳遞,SyntheticEvent是瀏覽器原生事件跨瀏覽器的封裝。SyntheticEvent 和瀏覽器原生事件一樣有 stopPropagation()、preventDefault() 接口,而且這些接口跨瀏覽器兼容。

  1. 原生事件
document.querySelector('xxx').addEventListener('click', () => {
    console.log(event);
})
// 輸出1:windowEvent ====>  chorme
// 輸出2:   undefined  ====>  Firefox

可以看出event參數不加的話,有的瀏覽器會兼容,像火狐就不兼容,因此需要在事件handler中寫

document.querySelector('xxx').addEventListener('click', event => {
    event = event || window.event;
    event.stopPropagation();
    event.preventDefault();
})

如果不寫event而是在函數中傳了某種參數,如果是chorme還好,會給你補充一個window.event,某些不支持的瀏覽器就會把你的參數當event了,當然會報錯了;

  1. React的事件
  • 0.12版本之前可以使用在event handler(onclick = xxx.bind(this))函數中使用return false來代替stopPropagation 和 preventDefault, 目前已經被移除,請不要使用。
  • 使用 合成事件(SyntheticEvent)(類似jquery的$event)是對各種瀏覽器兼容的event相關封裝,目前支持以下屬性
    • boolean bubbles
    • boolean cancelable
    • DOMEventTarget currentTarget
    • boolean defaultPrevented
    • Number eventPhase
    • boolean isTrusted
    • DOMEvent nativeEvent
    • void preventDefault()
    • void stopPropagation()
    • DOMEventTarget target
    • Date timeStamp
    • String type
  • 默認所有事件都在冒泡階段被觸發,如果想使用事件捕獲有兩種方法
    1. 使用原生addEventListener('click', handler, true)第三個參數給true
    2. 使用onClickCapture = xxx.bind(this);
  • 傳統開發方式在元素較多時建議使用事件委托 / 事件代理方式在父級進行代理事件,但React獨特的事件處理系統會先把所有事件處理函數都收集到父級,再根據組件進行派發,因此無需特意寫事件代理函數,即使一個列表有一萬個組件元構成,onClick函數也可以寫在組件元中。
  • 事件池
    event在React是一個虛擬對象,在事件被收集后到父級元素中時,虛擬對象會被合并,在該事件處理的回調后屬性就沒用了,如果用setState這種異步方法調用的話就沒有用了。
function onClick(event) {
  console.log(event); // =>無效的對象
  console.log(event.type); // => "click"
  var eventType = event.type; // => "click"

  setTimeout(function() {
    console.log(event.type); // => null
    console.log(eventType); // => "click"
  }, 0);

  this.setState({clickEvent: event}); // 不起作用.this.state.clickEvent 將只包含空值.
  this.setState({eventType: event.type}); // 您依然可以導出事件屬性
}

如果您想以一個異步的方式來訪問事件屬性,您應該對事件調用event.persist()。這將從事件池中取出合成的事件,并允許該事件的引用,使用戶的代碼被保留。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 以下文章為轉載,對理解JavaScript中的事件處理機制很有幫助,淺顯易懂,特分享于此。 什么是事件? 事件(E...
    jxyjxy閱讀 3,069評論 1 10
  • <a name='html'>HTML</a> Doctype作用?標準模式與兼容模式各有什么區別? (1)、<...
    clark124閱讀 3,554評論 1 19
  • 原教程內容詳見精益 React 學習指南,這只是我在學習過程中的一些閱讀筆記,個人覺得該教程講解深入淺出,比目前大...
    leonaxiong閱讀 2,860評論 1 18
  • 打斷喂食的鷹 鷹當然不開心 但鷹不計較 不代表世界太平 隱忍是個一時詞匯 忍耐也是過渡的語氣 包容是未上高樓的境界...
    翔于閱讀 210評論 0 1
  • 待我長發及腰,將軍歸來可好?此身君子意逍遙,怎料山河蕭蕭。天光乍破遇,暮雪白頭老。 寒劍默聽奔雷,長槍獨守空壕。醉...
    花兒笑微微閱讀 191評論 0 1