React事件委托

news/2024/7/7 20:41:47

React 事件委托(Event Delegation)是一种优化事件处理的技术,它通过将事件监听器添加到父级元素(而不是子元素)来实现。当事件触发时,事件会向上冒泡到父元素,然后在父元素上调用事件处理函数。通过事件委托,可以减少添加到 DOM 元素的事件监听器数量,从而提高性能。

在 React 中,事件委托自动由 React 事件系统处理,你无需手动实现它。React 事件系统创建了一个事件监听器,将它添加到应用的根元素(通常是 #root)。所有的事件都会冒泡到根元素,然后 React 根据事件的类型和目标元素来调用相应的事件处理函数。

由于 React 使用了事件委托,这使得在动态创建和销毁元素时,事件处理效率更高。如果没有事件委托,每次创建一个新元素时,你都需要为它添加一个新的事件监听器。同样,在销毁元素时,你需要手动移除事件监听器,以避免内存泄漏。而使用事件委托,React 可以处理所有这些问题,同时提高应用程序的性能。

下面是一个简单的 React 事件处理示例,展示了如何在 React 中使用事件委托:

import React, { Component } from 'react';

class App extends Component {
  handleClick = (event) => {
    alert(`Clicked on: ${event.target.textContent}`);
  }

  render() {
    return (
      <div onClick={this.handleClick}>
        <button>Button 1</button>
        <button>Button 2</button>
        <button>Button 3</button>
      </div>
    );
  }
}

export default App;

在这个例子中,我们将 onClick 事件处理器添加到了父级 <div> 元素。无论我们点击哪个按钮,都会触发 handleClick 函数。这是一个简单的事件委托示例,展示了如何在 React 中利用事件冒泡来优化事件处理。

如果还不明白的话,通过更接近业务的例子,深入体会一下React的事件委托的伟大!

下面是一个更实际的例子,这里我们创建了一个任务列表,当点击任务时,会将其标记为已完成。这个例子展示了如何利用事件委托来减少事件处理器的数量,提高性能。

import React, { Component } from 'react';

class TodoList extends Component {
  state = {
    todos: [
      { id: 1, text: 'Learn React', completed: false },
      { id: 2, text: 'Build a project', completed: false },
      { id: 3, text: 'Deploy to server', completed: false }
    ]
  };

  handleTodoClick = (event) => {
    const targetId = parseInt(event.target.getAttribute('data-id'));
    if (!targetId) return;

    this.setState((prevState) => ({
      todos: prevState.todos.map((todo) =>
        todo.id === targetId ? { ...todo, completed: !todo.completed } : todo
      )
    }));
  };

  render() {
    return (
      <ul onClick={this.handleTodoClick}>
        {this.state.todos.map((todo) => (
          <li
            key={todo.id}
            data-id={todo.id}
            style={{
              textDecoration: todo.completed ? 'line-through' : 'none'
            }}
          >
            {todo.text}
          </li>
        ))}
      </ul>
    );
  }
}

export default TodoList;

在这个例子中,我们有一个待办事项列表。我们将 onClick 事件处理程序添加到了父级 <ul> 元素。当我们点击其中一个待办事项时,handleTodoClick 函数会根据待办事项的 data-id 属性找到相应的待办事项,并将其标记为已完成。

如果没有事件委托,我们需要为每个 <li> 元素添加单独的事件处理程序。当待办事项列表很大时,这将导致大量的事件监听器。通过使用事件委托,我们只需在父级元素上添加一个事件处理程序,从而大大提高性能。

这个例子展示了事件委托如何在实际应用中减少事件处理器数量,优化性能。


http://lihuaxi.xjx100.cn/news/1126213.html

相关文章

power shell 入门

常用命令 powershell版本 不区分大小写: $psversiontable $psv + tab 自动补齐 // ps version get-command 或者 gcm //获取所有命令 get-help 命令名 // 获取命令帮助信息 路径相关 get-location 或者 gl 或者 pwd // 获取当前路径 pwd: print work directory 的缩写.

linux 下 ps、sort、top 命令详解

1、 ps命令 作用&#xff1a;查看系统进程&#xff0c;比如正在运行的进程有哪些&#xff0c;什么时候开始运行的&#xff0c;哪个用户运行的&#xff0c;占用了多少资源。 参数&#xff1a; -e 显示所有进程 -f 显示所有字段&#xff08;UID&#xff0c;PPIP&#xff0c;C…

内网渗透(六十九)之域权限维持之SID History 滥用

域权限维持之SID History 滥用 SID是用于标识主体的可变长度的唯一值,每个账户都有一个系统颁发的唯一SID,其存储在数据库(域中的话就存储在活动目录数据库中)。用户每次登录时,系统都会从数据库中检索该用户的SID,并将其放在该用户的访问令牌中。系统使用访问令牌中的S…

Hacking The Box----Awkward

信息收集 nmap扫描&#xff0c;发现22号端口和80号端口打开&#xff0c;80号端口上运行着http服务器。访问ip后URL变为hat-valley.htb 修改/etc/hosts文件&#xff0c;添加10.10.11.185 hat-valley.htb&#xff0c;然后就能正常访问网站。可以看到是一家卖帽子的公司的网站&a…

[元带你学NVMe协议] NVMe1.4 IO determinism | NVM Sets | Endurance Group 详解

声明 主页:元存储的博客_CSDN博客 依公开知识及经验整理,如有误请留言。 个人辛苦整理,付费内容,禁止转载。 内容摘要 全文2200字, 主要内容有 目录 前言 1 NVM Sets 1.1 概念 1.2 NVM set 与 namespace

Vue3+cropperjs 实现图片裁剪功能

安装cropperjs npm install cropperjs --save 或者 yarn add cropperjs封装一个cropperImg组件 //cropperImg.vue <template><div><!--使用ref属性给图片元素命名为imageRef--><img ref"imageRef" :src"imageSrc" alt"image&q…

ChatGPT入门到高级【第九章】

第一章&#xff1a;Chatgpt的起源和发展 1.1 人工智能和Chatbot的概念 1.2 Chatbot的历史发展 1.3 机器学习技术在Chatbot中的应用 1.4 Chatgpt的诞生和发展 第二章&#xff1a;Chatgpt的技术原理 2.1 自然语言处理技术 2.2 深度学习技术 2.3 Transformer模型 2.4 GPT模型 第…

Goby 漏洞更新 | Weblogic Commons Collections 序列化代码执行漏洞(CVE-2015-4852)

漏洞名称&#xff1a;Weblogic Commons Collections 序列化代码执行漏洞&#xff08;CVE-2015-4852&#xff09; English Name&#xff1a;Weblogic Commons Collections serialization code execution vulnerability (CVE-2015-4852) CVSS core: 7.5 影响资产数&#xff1a…