reactjs 如何获取React组件的所有已注册合成事件处理程序/侦听器的列表?

ruarlubt  于 2022-11-29  发布在  React
关注(0)|答案(2)|浏览(164)
var Rc = <MyReactComponent 
  onChange={(e) => {console.log(e);} 
  onClick={(e) => { workIt(); }} />;

如何获取组件Rc的侦听器列表['onChange','onClick']。
我看到与在DOM节点上查找侦听器相关的问题... How to find event listeners on a DOM node using JavaScript;显然不存在像getEventListeners()这样的简单调用,除了addEventListener()之外,DOM还支持DOES。
是否有一种干净而简单的方法来获取React组件的侦听器?

3npbholx

3npbholx1#

在React中没有任何内置的方法来实现这一点,但是您可以创建一个简单的函数来实现这一点:

// Build a mapping of event listeners
const getListeners = component => {
    return Object.fromEntries(
       Object
           .entries(component.props) // Get the props
           .filter(([key, value]) => key.startsWith("on")) // Filter event listeners
    );
};

const foo = <SomeComponent
    onChange={(e) => {console.log(e);} 
    onClick={(e) => { workIt(); }}
/>;

console.log("listeners", getListeners(foo));
// { onChange: f, onClick: f }

在本例中,我们过滤所有以“on”开头的getListeners属性,因为React中的每个事件侦听器都以“on”开头。
您可以通过显式过滤React中实际支持的事件侦听器来使其更加健壮:https://reactjs.org/docs/events.html#reference同时还要过滤每个道具的值以确保它是一个函数。

cbjzeqam

cbjzeqam2#

您的事件处理程序将被传递SyntheticEvent的示例,SyntheticEvent是一个跨浏览器的 Package 器,用于 Package 浏览器的本机事件。它与浏览器的本机事件具有相同的接口,包括stopPropagation()和preventDefault(),但这两个事件在所有浏览器中的工作方式相同。

支持的事件React规范化事件,以便它们在不同浏览器中具有一致的属性。

下面的事件处理程序由冒泡阶段中的事件触发。若要为捕获阶段注册事件处理程序,请将Capture追加到事件名称;例如,您可以使用onClickCapture来处理捕获阶段的click事件,而不是使用onClick。
1.剪贴板事件2.合成事件3.键盘事件4.焦点事件5.窗体事件6.一般事件7.鼠标事件8.指针事件9.选择事件10.触摸事件11.UI事件12.滚轮事件13.媒体事件14.图像事件15.动画事件16.过渡事件
您还可以创建如下OnChange事件:

import React from 'react';

function App() {

  function handleChange(event) {
    console.log(event.target.value);
  }
  
  return (
    <input name="firstName" onChange={handleChange} />
  );
}

export default App;

相关问题