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

javascript - react中绑定事件为啥不绑定在ul上使用事件代理而直接绑定在li上?

彭兴朝
2023-12-28

react中绑定事件为啥不绑定在ul上使用事件代理而直接绑定在li上?

// 普通写法const Sidebar = (props) => {  function clickCallback(e) {    let type = e.target.getAttribute("data-type");    props.pushTags(type);  }  return (    <ul className={styles.sidebar} id="ul">      {typeMap.map((item) => (        <li          data-type={item.id}          key={item.id}          onClick={(e) => clickCallback(e)}        >          {item.desc}        </li>      ))}    </ul>  );};
// 事件委托写法const Sidebar = (props) => {  useEffect(() => {    document.getElementById("ul").addEventListener("click", (e) => {      if (e.target.nodeName == "UL") return;      let type = e.target.getAttribute("data-type");      props.pushTags(type);    });  }, []);  return (    <ul className={styles.sidebar} id="ul">      {typeMap.map((item) => (        <li data-type={item.type} key={item.id}>          {item.desc}        </li>      ))}    </ul>  );};

共有2个答案

仇炜
2023-12-28

因为react合成事件已经用事件代理给你实现了

https://zh-hans.legacy.reactjs.org/docs/events.html

可以参考看看 https://segmentfault.com/a/1190000038251163

耿星雨
2023-12-28

在 React 中,通常推荐直接将事件处理器绑定到具体的元素上,而不是使用事件委托。以下是几个原因:

  1. 可预测性:当你在组件的 JSX 中直接绑定事件处理器时,你可以清楚地知道哪个组件有哪个事件处理器。这种方式使得代码更易于理解和维护。
  2. 避免全局状态:使用事件委托可能会导致全局状态的问题,因为事件委托通常需要在父元素上设置事件监听器,这可能会使得父元素的状态与子元素的状态耦合在一起。
  3. 性能:虽然事件委托在某些情况下可以提高性能(例如,当有很多子元素需要监听同一个事件时),但在大多数情况下,直接绑定事件处理器的性能更好,因为每次渲染时都会创建新的回调函数。
  4. 更好的 TypeScript 支持:如果你使用 TypeScript,直接绑定事件处理器可以更好地利用类型系统,因为你可以在组件中明确地指定事件的类型。

在你的例子中,如果你使用事件委托,你需要检查 e.target.nodeName 是否为 "UL",这可能会使得代码变得更复杂和难以理解。而且,如果 ul 元素被其他元素包裹(例如,<div> 元素),那么事件委托可能无法正常工作。因此,直接将事件处理器绑定到 li 元素上通常是更好的选择。

 类似资料:
  • 除了可以使用addEventListener()方法监听某个特定元素上的事件外,也可以使用.on()方法实现批量元素的事件绑定。 .on( event , selector , handler ) event Type: String 需监听的事件名称,例如:'tap' selector Type: String 选择器 handler Type: Function( Event event )

  • 本文向大家介绍js绑定事件和解绑事件,包括了js绑定事件和解绑事件的使用技巧和注意事项,需要的朋友参考一下 在js中绑定多个事件用到的是两个方法:attachEvent和addEventListener,但是这两个方法又存在差异性 attachEvent方法  只支持IE678,不兼容其他浏览器 addEventListener方法   兼容火狐谷歌,不兼容IE8及以下 addEventListe

  • DOM 提供了许多事件供开发者进行绑定,以响应各种操作,丰富页面交互。 想要触发事件,就得先给 DOM 节点绑定事件,提供事件处理器。 1. 直接在 HTML 上提供事件 这种方式是将事件内联在 HTML 代码中。 案例演示 预览 复制 复制成功! <style> .box { width: 100px; height: 100px; background: green

  • 事件绑定语法说明 MIP 提供了 on 属性来定义对组件的事件绑定与事件触发时的行为。 您已通过 MIP.scrollTo() 方法滚动到底部,请点击下方按钮返回原示例点击返回原示例 单事件绑定语法 on 属性的语法格式如下所示: <TAGNAME on="eventName:targetId.actionName(args)" > </TAGNAME> 相关参数的说明如下表所示: 参数名 是

  • 本文向大家介绍如何使用JavaScript处理绑定事件?,包括了如何使用JavaScript处理绑定事件?的使用技巧和注意事项,需要的朋友参考一下 要使用JavaScript处理事件,请在任何元素上对鼠标单击事件使用click。 示例 您可以尝试运行以下代码,以了解如何使用JavaScript处理绑定事件:

  • 本文向大家介绍写例子说明如何给li绑定事件(ul下有1000+个li)?相关面试题,主要包含被问及写例子说明如何给li绑定事件(ul下有1000+个li)?时的应答技巧和注意事项,需要的朋友参考一下 在不考虑任何情况时,直接使用 就可以对 进行事件绑定。 当子元素过多时,可以利用“事件冒泡”在 上进行绑定,实现事件委托。可以利用 对被触发的子元素进行操作。 参考文章:实例分析JavaScript中