当前位置: 首页 > 知识库问答 >
问题:

react.js - React有了事件代理我们需不需要自己再写事件代理?

何承
2023-07-03

如题,已知目前React是采用合成事件去完成“代理”我们的所有事件,那么既然React已经将所有的事件“挂”在了根节点容器上,我们还有没有必要循环列表的逻辑中写事件代理?例如如下伪代码:


// planA
<div>
[很长的列表].map(item => {
    return <li key={item.id} onClick={() => {
        // 点击事件的业务逻辑
    }}>{item.name}</li>
})
</div>

// planB
<div onClick={(e) => {
    // 代理列表的点击事件
}}>
[很长的列表].map(item => {
    return <li key={item.id}>{item.name}</li>
})
</div>

以上planB有没有必要?

共有1个答案

韩高峯
2023-07-03

React 中,合成事件是通过事件冒泡机制来实现事件代理的。在默认情况下,React 将所有的事件都绑定在根节点容器上,然后通过事件冒泡来触发对应的回调函数。因此,如果你使用的是类似 planA 的代码,那么不需要显式地对列表中的每个元素进行事件代理,React 已经自动帮你完成了事件代理的工作。

而对于类似 planB 的代码,虽然也可以完成事件代理的工作,但是并不推荐这样做。因为这种做法会将所有的事件绑定在根节点容器上,这可能会影响性能。而且,如果你在根节点容器上绑定了多个事件处理函数,那么这些处理函数的执行顺序可能是不确定的,这可能会导致一些意想不到的问题。

如果你使用 React,推荐使用类似 planA 的代码,直接在列表元素上绑定事件处理函数即可。React 会自动完成事件代理的工作,你不需要显式地进行事件代理。如果你需要对列表元素进行事件代理,也可以使用列表元素的父元素来进行事件代理,这样会更加高效和可靠

 类似资料:
  • 问题内容: 我最近有一个关于如何在另一个类的主方法中打开登录面板的问题。因为我还没有在Swing中上过任何课(仅是基本的Java编程),所以我已经偶然发现了另一个问题。 我如何检测用户是否按下了JPanel中的按钮并使它执行某项操作。 例如:用户按下了登录-> if(textfield1.getText()==“ user”){打开另一个JFrame}->等等。 这是我的主要代码: 这是Login

  • 我们需要将JMS队列中的消息持久化到事务中的数据库中,以确保在DB持久化期间抛出任何错误时不会确认JMS消息。基于此处提供的解决方案——使用消息驱动通道适配器时的事务处理 请确认理解是否正确。此外,还有以下问题 在这种情况下是否需要TransactionAware ConnectionFactoryProxy JMS Queue和JDBC是两个独立的事务资源。如本例所示,将jdbc事务管理器注入J

  • 问题内容: 为什么编译器没有在开关中的每个代码块之后自动放置break语句?是出于历史原因吗?您何时要执行多个代码块? 问题答案: 有时将多个案例与同一代码块关联会很有帮助,例如 等。只是一个例子。 以我的经验,通常“摔倒”并在一种情况下执行多个代码块是不好的风格,但是在某些情况下可能会有用处。

  • 根据我的理解,当数据库事务跨越微服务时,我们可以通过使用message-broker(kafka、RabbitMQ等)通过发布事件来解决这个问题,这样订阅者微服务就可以通过监听这些事件来更新他们的数据库。 在异常情况下,我们可以发送故障事件,以便订阅服务器服务更新它们的状态。 我们真的需要事件来源吗?

  • 主要内容:实例,向事件处理程序传递参数React 元素的事件处理和 DOM 元素类似。但是有一点语法上的不同: React 事件绑定属性的命名采用驼峰式写法,而不是小写。 如果采用 JSX 的语法你需要传入一个函数作为事件处理函数,而不是一个字符串(DOM 元素的写法) HTML 通常写法是: React 中写法为: 在 React 中另一个不同是你不能使用返回 false 的方式阻止默认行为, 你必须明确使用 preventDefa

  • 问题内容: 我有一个注册为HID设备的RFID USB设备(一个或多个USB键盘)。 我正在寻找一种捕获此输入的方法,并在它击中普通键盘事件处理程序之前对其进行阻止/过滤(并将10位RFID代码输出到控制台)。 我当然必须专门捕获该设备,而不必留下真正的键盘输入(或传递它)。 我最初的想法是在UDEV中阻止该设备(因此usbhid / event / kbd内核模块未绑定到该设备)并为该设备编写我