首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在React中使用e.target使用EventListener而不是其子元素来记录元素

在React中,如果你想要使用e.target来监听事件而不是其子元素,你可以使用事件委托的方式。事件委托是一种常见的前端技术,它利用了事件冒泡的特性,将事件监听器添加到父元素上,然后通过e.target来确定实际触发事件的元素。

基础概念

事件冒泡:当一个子元素上的事件被触发时,该事件会从目标元素开始,逐级向上传播到它的父元素,直到document对象。

事件委托:利用事件冒泡机制,将事件监听器添加到父元素上,通过e.target来获取实际触发事件的子元素。

优势

  1. 性能优化:减少事件监听器的数量,特别是在处理大量子元素时。
  2. 动态元素处理:对于动态添加的子元素,不需要额外绑定事件监听器。

类型与应用场景

  • 通用事件监听:适用于任何需要监听多个子元素事件的场景。
  • 动态内容:当页面内容动态变化时,事件委托可以自动适应新的元素。

示例代码

假设你有一个列表,想要监听列表项的点击事件:

代码语言:txt
复制
import React, { useEffect } from 'react';

function ListComponent() {
  const listRef = React.useRef(null);

  useEffect(() => {
    const handleClick = (e) => {
      if (e.target.closest('li')) {
        console.log('Clicked on:', e.target.textContent);
      }
    };

    const currentRef = listRef.current;
    currentRef.addEventListener('click', handleClick);

    return () => {
      currentRef.removeEventListener('click', handleClick);
    };
  }, []);

  return (
    <ul ref={listRef}>
      <li>Item 1</li>
      <li>Item 2</li>
      <li>Item 3</li>
    </ul>
  );
}

export default ListComponent;

解释

  1. useRef:创建一个引用指向列表元素。
  2. useEffect:在组件挂载时添加事件监听器,在卸载时移除监听器。
  3. 事件处理函数handleClick函数通过e.target.closest('li')来判断点击的是否是列表项,并输出其内容。

可能遇到的问题及解决方法

问题:事件监听器没有正确移除,导致内存泄漏。

解决方法:确保在useEffect的清理函数中移除事件监听器。

代码语言:txt
复制
return () => {
  currentRef.removeEventListener('click', handleClick);
};

问题e.target指向的不是预期的元素。

解决方法:使用closest方法来确保获取到的是预期的元素。

代码语言:txt
复制
if (e.target.closest('li')) {
  // 处理逻辑
}

通过这种方式,你可以有效地使用事件委托来处理React组件中的事件,同时避免一些常见的陷阱。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【React】786- 探索 React 合成事件

看个简单示例: const button = Leo 按钮 在 React 中,所有事件都是合成的,不是原生 DOM 事件...事件名称命名方式不同 原生事件命名为纯小写(onclick, onblur),而 React 事件命名采用小驼峰式(camelCase),如 onClick 等: // 原生事件绑定方式 <button...; }; childClickFun = () => { console.log("React 事件:子元素事件监听!")...原生事件:父元素 DOM 事件监听! React 事件:子元素事件监听! React 事件:父元素事件监听! 原生事件:document DOM 事件监听!...向事件传递参数问题 经常在遍历列表时,需要向事件传递额外参数,如 id 等,来指定需要操作的数据,在 React 中,可以使用 2 种方式向事件传参: const List = [1,2,3,4]; class

1.8K40

探索 React 合成事件

看个简单示例: const button = Leo 按钮 在 React 中,所有事件都是合成的,不是原生 DOM 事件,...事件捕获 当某个元素触发某个事件(如 onclick ),顶层对象 document 就会发出一个事件流,随着 DOM 树的节点向目标元素节点流去,直到到达事件真正发生的目标元素。...事件名称命名方式不同 原生事件命名为纯小写(onclick, onblur),而 React 事件命名采用小驼峰式(camelCase),如 onClick 等: // 原生事件绑定方式 元素 DOM 事件监听! React 事件:子元素事件监听! React 事件:父元素事件监听! 原生事件:document DOM 事件监听!...向事件传递参数问题 经常在遍历列表时,需要向事件传递额外参数,如 id 等,来指定需要操作的数据,在 React 中,可以使用 2 种方式向事件传参: const List = [1,2,3,4]; class

4.1K22
  • react入门(五):事件处理、条件渲染、列表&keys、表单

    一、事件处理 React事件绑定属性的命名采用驼峰式写法,而不是小写。...React识别哪些元素发生了变化。...当子节点有key时,React使用key来匹配原本树的子节点和新树的子节点。因此你应当给数组中的每一个元素赋予。 万不得已,你可以传递他们在数组中的索引作为key。...若元素没有重排,该方法效果不错,但重排会使得其变慢。当索引用作key时,组件状态在重新排序时也会有问题。 组件实例基于key进行更新和重用。如果key是索引,则item的顺序变化会改变key值。...//2.使用非受控组件实现表单(从ref中获取dom的值) export default class Form extends React.Component{ constructor () {

    1.1K20

    《现代Javascript高级教程》深入理解事件处理和传播机制

    React利用了合成事件( SyntheticEvent)来处理事件,实现了跨浏览器的一致性和性能优化。 在React中,事件处理程序是通过特定的语法和属性绑定到组件的,而不是直接操作DOM元素。...在事件捕获阶段,可以使用addEventListener的第三个参数指定事件处理程序在捕获阶段中执行。...在事件冒泡阶段,可以使用addEventListener的第三个参数设置为false或省略来指定事件处理程序在冒泡阶段中执行(默认值)。...通过在父元素上注册事件处理程序,可以利用事件冒泡机制,统一管理子元素的事件处理。 例如,可以在父元素上注册click事件处理程序,根据触发事件的具体子元素进行不同的操作。...它利用事件冒泡机制,在父元素上注册一个事件处理程序,处理多个子元素的相同事件。 例如,可以在父元素上注册click事件处理程序,根据触发事件的子元素的不同类别执行不同的操作。

    23940

    记录一些前端面试题

    ,数组元素包含整数或数组,函数返回扁平化后的数组,如:[1,[2,[[3,4],5],6]] = > [1,2,3,4,5,6]。...event.target,大部分时候事件可能是由子元素触发的,但是在捕获、冒泡的过程中被父级元素的事件监听器获取到了,注册监听事件的父级元素就是这种情况下event.currentTarget,而事件触发者也就是子元素就是...addEventListener() 方法在按钮中添加点击事件。...遍历一个某一元素下的所有子元素(包括子元素的子元素)的方法,打印出所有子元素的ID 假设要遍历document.body var allNodes = []; function getChildNode...+) { //childNode获取到到的节点包含了各种类型的节点 //但是我们只需要元素节点 通过nodeType去判断当前的这个节点是不是元素节点

    64820

    一文带你梳理React面试题(2023年版本)

    转义时,调用了React.createElement函数,它接收三个参数,分别是type元素类型,props元素属性,children子元素。...React组件怎样可以返回多个组件使用HOC(高阶函数)使用React.Fragment,可以让你将元素列表加到一个分组中,而且不会创建额外的节点(类似vue的template)renderList()...:事件绑定 事件触发React所有的事件绑定在container上(react17以后),而不是绑定在DOM元素上(作用:减少内存开销,所有的事件处理都在container上,其他节点没有绑定事件)React...和浏览器的事件循环机制,每个setState都会被react加入到任务队列,多次对同一个state使用setState只会返回最后一次的结果,因为它不是立刻就更新,而是先放在队列中,等时机成熟在执行批量更新...Element对象)中只记录了子节点,没有记录兄弟节点,因此渲染不可打断fiber(fiberNode对象)是一个链表,它记录了父节点、兄弟节点、子节点,因此是可以打断的

    4.3K122

    如何用120行代码,实现一个交互完整的拖拽上传组件?

    一个完整拖拽上传行为覆盖的四个事件:dragover、dragenter、drop、dragleave 如何使用React Hooks编写自己的UI组件库。 逛国外社区时看到这篇: ?...How To Implement Drag and Drop for Files in React 文章讲了React拖拽上传的精简实现,但直接翻译照搬显然不是我的风格。...React Hooks中 新增了useRef API 语法 const refContainer = useRef(initialValue); useRef 返回一个可变的 ref 对象,。...其 .current 属性被初始化为传递的参数(initialValue) 返回的对象将存留在整个组件的生命周期中。...事件在生命周期里的触发与销毁 原本EventListener的事件需要在componentDidMount添加,在componentWillUnmount中销毁: componentDidMount (

    2K30

    第二十五期:React中的10个基本概念

    所以它并没有像之前的开发流程一样,将js和html放在不同的文件中。而是将html和Js逻辑共同写在组件中。 元素 元素是构成 React 应用的最小砖块。...以往我们在写html的界面的时候,一般用dom标签表示一个元素,比如一个div元素。 但是在React中,元素的概念稍有不同,React中的元素指的是创建的一个小的对象。...这个对象元素会由React-Dom中的API更新成Dom节点,并且这个Dom节点和那个react对象元素保持一致。...一旦被创建,就无法更改它的子元素或者属性。 更新UI的唯一方式就是创建一个全新的元素,并使用ReactDom.render()进行渲染。 但是:React只更新它需要更新的部分。...DOM 会将元素和它的子元素与它们之前的状态进行比较,并只会进行必要的更新来使 DOM 达到预期的状态。

    36710

    React 无障碍

    虽然大多数 React 的 DOM 变量和属性命名都使用驼峰命名(camelCased),但 aria-* 应该像其在 HTML 中一样使用带连字符的命名法(也叫诸如 hyphen-cased,kebab-case...利用多种 HTML 元素来强化您网站中的信息通常可以使您直接获得无障碍辅助功能。 有时,语义化的 HTML 会被破坏。...比如当在 JSX 中使用  元素来实现 React 代码功能的时候,又或是在使用列表(,  和 )和 HTML  时。...在这种情况下,我们应该使用 React Fragments 来组合各个组件 Fragments Fragments React组件返回多个元素,Fragments允许将子列表分组,而无需向DOM添加额外节点...将子组件的换成 import React, { Fragment } from 'react'; class Columns extends React.Component

    26130

    【19】进大厂必须掌握的面试题-50个React面试

    React中有什么事件? 在React中,事件是对特定动作(如鼠标悬停,鼠标单击,按键等)的触发反应。处理这些事件类似于处理DOM元素中的事件。...但是在语法上存在一些差异,例如: 事件使用驼峰式大小写而不是仅使用小写字母命名。 事件是作为函数而不是字符串传递的。 事件参数包含一组特定于事件的属性。...每个事件类型都包含其自己的属性和行为,这些属性和行为只能通过其事件处理程序进行访问。 23.如何在React中创建事件?...React中按键的意义是什么? 密钥用于标识唯一的虚拟DOM元素及其驱动UI的相应数据。它们通过回收DOM中的所有现有元素来帮助React优化渲染。...这些键必须是唯一的数字或字符串,React只能使用这些数字或字符串对元素进行重新排序,而不是重新渲染它们。这导致应用程序性能的提高。 React Redux – React面试问题 34.

    11.2K30

    react是如何实现冒泡的

    一方面从历史沿革来看,在浏览器的早期,Netscape 浏览器是使用的 capture 事件模型,而 IE 使用的是冒泡模型,后来的标准里面就有了这两种模型可选: element.addEventListner...,那么使用其他的事件来监测子元素的 change 变化 分别绑定 focusout click keydown beforeactivate 等监控函数 当发现目标元素,比如 input,发生了值的变化...的最后一个参数为true轻松搞定 巧妙的使用 addEventListener 的第3个捕获参数,那么首先事件就会在 root 被捕获 然后获取到 e.target 也就是 input元素,然后再通过...react 事件是绑定到 document上的,所以 e.currentTarget 是 document,e.target 是 input 根据 input,获取向上冒泡的路径,即会冒泡元素 collectPaths...,然后一个循环触发,如果循环中有 stopPropagation,那么终止循环 当然这都不是 react 的实际实现,因为 React 的代码太难读了,盘根错节,我还没有找到具体实现在哪里。

    1.8K20

    《React 面试必知必会》Day5

    当一个组件的 props 或 state 发生变化时,React 通过比较新返回的元素和之前渲染的元素来决定是否有必要进行实际的 DOM 更新。当它们不相等时,React 将更新 DOM。...为什么 React 使用 className 而不是 class 属性? class 是 JavaScript 的一个关键字,而 JSX 是 JavaScript 的一个扩展。...这就是为什么 React 使用 className 而不是 class 的主要原因。传递一个字符串作为 className prop。...什么是 React 中的传递门(Portal)? 传递门是一种推荐的方式,可以将子节点渲染到父组件的 DOM 层次结构之外的 DOM 节点中。...第二个参数是一个 DOM 元素。 9. 什么是无状态组件? 如果行为是独立于其状态的,那么它可以是一个无状态组件。你可以使用函数或类来创建无状态组件。

    1.2K60

    useRef 进阶

    一直以来使用useRef的场景比较常见和基础,大多是为了操作已经mount的dom节点,例如设置焦点之类的,如官方例子所示: function TextInputWithFocusButton() {...它可以很方便地保存任何可变值,其类似于在 class 中使用实例字段的方式。...*** 场景分析 我们需要在react function component中实现模糊搜索,用户输入过程中触发input组件的onChange事件时获取数据,动态更新下拉列表中的数据项。...分析后发现,由于react function component的特性,每次渲染都会生成一个新的 updateOptions 方法的副本, 而lodash中的throttled方法默认leading 为...当你把回调函数传递给经过优化的并使用引用相等性去避免非必要渲染(例如 shouldComponentUpdate)的子组件时,它将非常有用。

    1.2K10

    8分钟为你详解React、Angular、Vue三大框架

    显著特点 组件化 React代码由称为组件的实体组成。组件可以使用React DOM库渲染到DOM中的一个特定元素。当渲染一个组件时,可以传入被称为 "props "的值。 ?...它们也被称为 "有状态 "组件,因为它们的状态可以在整个组件中保持,并且可以通过props传递给子组件。 ? 虚拟 DOM 另一个值得注意的特点是React使用了虚拟文档对象模型,也就是虚拟DOM。...React创建了一个内存中的数据结构缓存,计算得出变化差异,只渲染实际变化的子组件, 从而高效地更新浏览器显示的DOM。...这通常用于清除组件的资源依赖关系,这些依赖关系不会随着组件的卸载而简单地被移除(例如,移除任何与组件相关的setInterval()实例,或者因为组件的存在而在 "文档 "上设置的 "eventListener...特点 1、组件化 Vue 组件扩展了基本的 HTML 元素来封装可重用的代码。从高层次的角度看,组件是Vue编译器附加行为的自定义元素。在Vue中,组件本质上就是一个带有预设选项的Vue实例。

    22.2K20

    React 面试必知必会 Day 6

    如何在 React 中对 props 进行验证? 当应用程序运行在开发模式时,React 会自动检查我们在组件上设置的所有 props,以确保它们具有正确的类型。...使用 Jest 等工具容易编写单元和集成测试。 3. React 的局限性是什么? 除了优点之外,React 也有一些限制。 React 只是一个视图库,不是一个完整的框架。...错误边界是指在其子组件树的任何地方捕获 JavaScript 错误的组件,记录这些错误,并显示一个后备 UI ,而不是崩溃的组件树。...此方法用于将 React 元素渲染到提供的容器中的 DOM 中,并返回对组件的引用。如果 React 元素之前已渲染到容器中,它将对其执行更新,并且仅在必要时更改 DOM 以反映最新更改。...如何在 React 中使用 innerHTML? dangerouslySetInnerHTML 属性是 React 在浏览器 DOM 中使用 innerHTML 的替代品。

    5K30

    React面试:谈谈虚拟DOM,Diff算法与Key机制5

    ,证实虚拟DOM本质就是js对象: 图片其中,在jsx中使用的原生元素标签,其type为标签名。...然而,即使在最前沿的算法中,该算法的复杂程度为 O(n 3 ),其中 n 是树中元素的数量。如果在 React 中使用了该算法,那么展示 1000 个元素所需要执行的计算量将在十亿的量级范围。...例如,可以通过 CSS 隐藏或显示节点,而不是真正地移除或添加 DOM 节点(2)component diff:component diff是专门针对更新前后的同一层级间的React组件比较的diff...(5)key使用注意事项:如果遍历的列表子节是作为纯展示,而不涉及到列表元素顺序的动态变更,那使用index作为key还是没有问题的。...key只是针对同一层级的节点进行了diff比较优化,而跨层级的节点互相之间的key值没有影响大部分情况下,通过遍历的同一层级的使用了key属性的元素节点其节点类型是相同的(比如都是span元素或者同一个组件

    1.3K50

    组件注册与画布渲染

    children: 子组件,类型为 ComponentInstance[]。...对于 element 的命名,可能会产生分歧,比如还有其他命名风格如 render、renderer、reactNode 等等,但不管叫什么名字,只要是基于 React 响应式定义的,最终应该都殊途同归...注意:propsType 中 {} 表示 value 是对象,而 [] 表示 value 是数组。为数组时,仅支持单个子元素,因为单项即是对数组每一项类型的定义。...因此要给组件 props 注入函数,需要定义在组件元信息上,由于其定义了额外的 props 属性,且不在组件树中,所以我们将其命名为 runtimeProps: const divMeta = {...我们还介绍了如何在组件元信息定义组件的渲染函数,如何给渲染函数 props 传入基本变量、React 实例以及函数,让渲染函数可以对接任何成熟的组件库,而不需要组件库做任何适配工作。

    1.3K20

    react入门——慕课网笔记

    settimeout函数参数中时,由于函数参数就是一个纯粹的函数调用,不隶属于其他对象,隶属于全局对象,属于global  当其出现在setinistialstate这样的函数体内,是作为其所属实例对象的方法来调用...或classname   事件绑定:Eventlistener   React: 给组件添加事件绑定(on驼峰式命名方式) render: function (){   return(...获取组件   1)使用‘ref’ property标记组件   用ref属性给子组件添加名字,通过this.refs可以索引到子组件 render: function (){ return(...component而不是真实的dom节点   2)在dom里获得这个节点:   使用react提供的方法:ReactDOM.findDOMNode(react component) 五、 补充 ajax...textarea 元素、select元素、radio元素都属于这种情况   7. 使用map遍历时注意: ?

    1.3K20

    React面试:谈谈虚拟DOM,Diff算法与Key机制_2023-02-27

    ,证实虚拟DOM本质就是js对象: 图片 其中,在jsx中使用的原生元素标签,其type为标签名。...然而,即使在最前沿的算法中,该算法的复杂程度为 O(n 3 ),其中 n 是树中元素的数量。 如果在 React 中使用了该算法,那么展示 1000 个元素所需要执行的计算量将在十亿的量级范围。...例如,可以通过 CSS 隐藏或显示节点,而不是真正地移除或添加 DOM 节点 (2)component diff: component diff是专门针对更新前后的同一层级间的React组件比较的diff...(5)key使用注意事项: 如果遍历的列表子节是作为纯展示,而不涉及到列表元素顺序的动态变更,那使用index作为key还是没有问题的。...key只是针对同一层级的节点进行了diff比较优化,而跨层级的节点互相之间的key值没有影响 大部分情况下,通过遍历的同一层级的使用了key属性的元素节点其节点类型是相同的(比如都是span元素或者同一个组件

    99420
    领券