簡體   English   中英

你如何在反應時全局禁用 DOM Mouseenter 事件

[英]How do you globally disable DOM Mouseenter events on react

我正在寫一個插件,我希望我能在某個時候禁止一些 dom 元素 mouseenter 事件,這些 dom 元素不是我能控制的,例如在使用原生 js 時

<body>
  <div>
    <div id="test"></div>
  </div>
  <script>
    const test=document.getElementById('test')
    test.addEventListener('mouseenter', () => {
      console.log('test mouseenter')
    })

    document.addEventListener('mouseenter', (e) => {
      e.stopPropagation()
    }, true)
  </script>
</body>

測試元素的 Mouseenter 不再起作用。但是在 react 中,它不起作用。like

import React, { useState } from 'react';
document.addEventListener('mouseenter', (e) => {
  e.stopPropagation()
}, true)
export default () => {
  const handleMouseEnter = () => {
    console.log('entery');
  }

  return (
    <div onMouseEnter={handleMouseEnter} >
      test
    </div>
  );
}

應該怎么做才能達到原生JS的效果

React-17 文檔說:

“當文檔上觸發 DOM 事件時,React 會確定要調用哪個組件,然后 React 事件會向上“冒泡”通過您的組件。但在幕后,本機事件已經冒泡到文檔級別,React安裝其事件處理程序。”

如果頁面上有多個 React 版本,它們都會在頂部注冊事件處理程序。 這會破壞 e.stopPropagation():如果嵌套樹停止傳播事件,外部樹仍會接收它。 這使得嵌套不同版本的 React 變得困難。 這種擔憂不是假設性的——例如,Atom 編輯器在四年前就遇到過這種情況。

在 React 16 和更早的版本中,React 會對大多數事件執行 document.addEventListener()。 React 17 將在底層調用 rootNode.addEventListener() 。

此資源可能會有所幫助: https://reactjs.org/blog/2020/08/10/react-v17-rc.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM