iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >react中事件处理与柯里化的实现
  • 633
分享到

react中事件处理与柯里化的实现

2024-04-02 19:04:59 633人浏览 八月长安
摘要

目录1. 事件处理阻止默认行为合成事件2. 柯里化柯里化的目的一个简单的例子1. 事件处理 React 中元素也可接受、处理事件,但是在语法上有一点不同。 在React 中所有事件的

1. 事件处理

React 中元素也可接受、处理事件,但是在语法上有一点不同。

在React 中所有事件的命名采用的是小驼峰,而非原生 DOM 的纯小写,所有事件需要我们传入一个函数,而非字符串

例如:

const Button = () => {
    const handleClick = () => {
        console.log('click')
    }
    return <button onClick={handleClick}>click button</button>
}

当事件的回调函数比较简单时,我们也可以简写箭头匿名函数,例如:

const Button = () => {
    return (
        <button
            onClick={() => console.log('click')}
        >
            click button
        </button>)
}

阻止默认行为

在React 中不能通过返回 false 来阻止默认行为,例如表单提交、a标签跳转。我们必须要通过显式调用 preventDefault 函数,来阻止这些默认行为。

const Link = () => {
    return <a
        href="https://www.baidu.com" rel="external nofollow"  rel="external nofollow" 
        onClick={(e) => e.preventDefault()}
    >
        link
    </a>
}

合成事件

在 React 中几乎所有的事件处理函数,都是一个 (event)=>void 函数,如果我们使用 typescript,可以清晰的看到每个事件对应的函数类型,React 自身也声明了很多的事件与事件处理函数类型,例如鼠标事件:MouseEvent<T = Element>MouseEventHandler<T = Element>,我们在使用时可以根据自己的喜欢,是定义函数类型还是定义参数类型,就像这样:

const Link = () => {
    const handleClick = (e: MouseEvent) => {
        e.preventDefault()
        console.log('click')
    }
    const handleMouseEnter:MouseEventHandler = (e) => {
        console.log('mouse enter')
    }
    return <a
        href="Https://www.baidu.com" rel="external nofollow"  rel="external nofollow" 
        onMouseEnter={handleMouseEnter}
        onClick={handleClick}
    >
        link
    </a>
}

在 React 中,所有事件都是 React 根据 W3C 规范定义的合成事件,所以我们完全不用担心兼容性问题,React 事件与原生事件不完全相同。

点击此处查看合成事件文档

2. 柯里化

柯里化这个名称对于 Android 开发可能有点陌生,因为我们一般使用 Java 开发,因为早期的 Java 不支持函数式编程(FP),而柯里化是一个函数式编程思想。

简而言之是将一个多参函数变成单参数函数,举个栗子:

//柯里化后的单参数函数
function sumCurrying(a) {
  return (b) => {
    return (c) => {
      return a + b + c;
    };
  };
}
//普通的多参数函数
function sumNORMal(a, b, c) {
  return a + b + c
}
console.log(sumCurrying(1)(2)(3));
console.log(sumNormal(1, 2, 3));

柯里化的本质,就是高阶函数的一个特性:函数的返回值可以是一个函数。

上面的例子,似乎有点脱裤子放屁,看似毫无意义。但实际工程中,柯里化是一个非常实用的小 trick。最常用在事件处理需要传入值的场景。

我们在上面说过了,React 中的事件回调函数是有固定的函数类型的,几乎都是 (event)=>void 函数。我们需要传入一些参数给这个事件处理函数呢?

const List = () => {
    const list = [
        { id: 1, name: 'tom' },
        { id: 2, name: 'jerry' },
        { id: 3, name: 'jack' },
        { id: 4, name: 'lily' },
    ]
    const handleClick = (id: number) => {
        console.log(id)
    }
    return <ul>
        {list.map(item => <li
                onClick={() => handleClick(item.id)}
                key={item.id}
            >
                {item.name}
            </li>
        )}
    </ul>
}

这看起来似乎很不优雅,我们已经声明了 handle 函数,却又不得不在事件处理函数中写行内的箭头函数,如何才能更加优雅的处理呢?

其实很简单,我们只需要在原本的 handle 函数中,插入一个箭头即可,就像这样:

//before
const handleClick = (id: number) => {
  console.log(id)
}
//after
const handleClick = (id: number) => (e:MouseEvent) => {
  console.log(id)
}

然后我们的 onClick 事件回调函数就可以改成 onClick={handleClick(item.id)} ,这样看起来是不是就更加优雅了呢?

其实这种设计思想可以说是一说就透,只不过我现在告诉你,这种思想就叫做:柯里化

柯里化的目的

你可能会问我柯里化看起来只是让我们的代码优雅了一点,在目前看来似乎没有什么本质上的变化。

但其实柯里化帮助我们实现了函数的一变多,我们用一个日志输出的函数作为例子:

//原始函数
const log = (date, importance, message) => {
  alert(`[${date.getHours()}:${date.getMinutes()}] [${importance}] ${message}`);
}
//柯里化
const loGCurry = (date) => (importance) => (message) => { 
  alert(`[${date.getHours()}:${date.getMinutes()}] [${importance}] ${message}`);
}

柯里化后,函数变成这样调用:logCurry(new Date())("DEBUG")("some debug");

现在我们相当于拥有这些函数:

// logNow 会是带有固定第一个参数的日志的函数
let logNow = logCurry(new Date());

// 使用它
logNow("INFO", "message"); // [HH:mm] INFO message

// debugNow 会是带有固定第一个参数与第二个参数的函数
let debugNow = logNow("DEBUG");

debugNow("message"); // [HH:mm] DEBUG message

看起来只是增加了几个箭头,实际上我们函数的灵活性大为增加。通过固定不同的参数,我们从一个函数声明获得了多个函数。

一个简单的例子

const Form = () => {
   const [form, setForm] = React.useState({});
   const update = (name) => (event) => {
     setForm({
       ...form,
       [name]: event.target.value,
     });
   }
   const handleSubmit = (event) => {
     event.preventDefault();
     alert(`${JSON.stringify(form)}`);
   }
   return (
     <div>
       <h1>柯里化表单</h1>
       <FormItem label="用户名" name='username' update={update} />
       <FormItem label="昵称" name='nickname' update={update} />
       <FormItem label="邮箱" name='email' update={update} />
       <button onClick={handleSubmit}>提交</button>
     </div>
   )
 }

 const FormItem = ({ label, name, update }) => {
   return (
     <div style={{ 'display': 'flex' }}>
       <label>{label}</label>
       <input onChange={update(name)} type="text" placeholder={`请输入${label}`} />
     </div>
   );
 };

到此这篇关于react中事件处理与柯里化的实现的文章就介绍到这了,更多相关react 事件处理与柯里化内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: react中事件处理与柯里化的实现

本文链接: https://www.lsjlt.com/news/149514.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • react中事件处理与柯里化的实现
    目录1. 事件处理阻止默认行为合成事件2. 柯里化柯里化的目的一个简单的例子1. 事件处理 React 中元素也可接受、处理事件,但是在语法上有一点不同。 在React 中所有事件的...
    99+
    2022-11-13
  • React事件处理过程中传参的实现方法
    目录摘要1.箭头函数2.函数柯里化3.bind方法摘要 首先我们知道,在React中,是通过小驼峰式给元素绑定事件: fn = ()=>{ //执行代码 } ...
    99+
    2022-11-13
    React事件处理过程中传参 React事件处理 React传参
  • JavaWebListener实现事件监听与处理
    目录Listener接口回调Web监听器监听三个作用域创建和销毁监听三个作用域属性状态变更监听HttpSession里面存值的状态变更Listener的应用场景总结在Java Web...
    99+
    2023-05-18
    Java Listener事件监听 Java Listener事件处理
  • ECharts事件处理与旭日图实现
    事件处理 ECharts 中我们可以通过监听用户的操作行为来回调对应的函数。 ECharts 通过 on 方法来监听用户的行为,例如监控用户的点击行为。 ECharts 中事件分为两...
    99+
    2022-11-13
  • React组件创建与事件绑定的实现方法
    目录1、组件创建方式方式一-函数创建组件方式二-使用类创建组件2、事件绑定方式一-类组件绑定事件方式二-函数组件绑定事件周末在家,练习React,记录下来,方便查看。 本期学习Rea...
    99+
    2022-12-26
    React组件创建 React事件绑定
  • React中Portals与错误边界处理实现
    目录Portals 错误边界处理 如果没有使用错误边界会怎样? 注意点 Portals 可以说是 插槽,但 不同于 Vue 中的 slot,它指的是将一个 React 元素渲染到指...
    99+
    2022-11-12
  • React中的合成事件怎么实现
    这篇文章主要介绍了React中的合成事件怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇React中的合成事件怎么实现文章都会有所收获,下面我们一起来看看吧。1 事件三个阶段 捕获、目标、处理 (具体百度...
    99+
    2023-07-05
  • React中Portals与错误边界处理实现方法
    这篇文章主要讲解了“React中Portals与错误边界处理实现方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“React中Portals与错误边界处理实现方法”吧!目录Portals错误...
    99+
    2023-06-20
  • React中Portals与错误边界处理怎么实现
    这篇“React中Portals与错误边界处理怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“React中Portal...
    99+
    2023-06-05
  • 阿里云服务器出现入侵事件的处理方法与建议
    在现代网络环境中,服务器被入侵已经成为一个常见的问题。尤其是阿里云这样的大型云服务平台,服务器的安全问题尤为重要。当阿里云服务器出现入侵事件时,我们需要采取有效的处理方法和措施,以减少损失并防止类似事件再次发生。本文将对此进行详细说明。 首...
    99+
    2023-12-15
    阿里 事件 建议
  • Golang与RabbitMQ实现事件驱动的大规模数据处理系统的设计与实现
    设计与实现一个基于Golang和RabbitMQ的事件驱动的大规模数据处理系统可以分为以下几个步骤:1. 定义事件模型:首先需要定义...
    99+
    2023-10-08
    Golang
  • Golang与RabbitMQ实现事件驱动的大规模数据处理系统
    要使用Golang和RabbitMQ实现事件驱动的大规模数据处理系统,可以按照以下步骤进行:1. 安装RabbitMQ:首先,需要在...
    99+
    2023-10-08
    Golang
  • React中事件绑定this指向三种方法的实现
    1.箭头函数 1.利用箭头函数自身不绑定this的特点; 2.render()方法中的this为组件实例,可以获取到setState(); class App extends ...
    99+
    2022-11-12
  • pygame实现键盘和鼠标事件的处理
    所谓事件,就是程序上发生的事。例如用户按下键盘上的某个键或者单击、移动鼠标,对于这些事件,游戏程序需要作出反应。如《 pygame 图像/图形绘制》中例子,程序会一直运行下去,直到用...
    99+
    2022-11-11
  • react组件封装input框的防抖处理的项目实现
    目录防抖1.类组件版本2.函数组件版本防抖 防抖就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间 项目中有些input框需要做防抖...
    99+
    2023-05-18
    react input框防抖 react 输入框防抖
  • 如何实现MySQL中的事务处理?
    如何实现MySQL中的事务处理?事务是数据库中重要的概念之一,能够保证数据的一致性和完整性,确保在并发操作中数据的正确性。MySQL作为一种常用的关系型数据库,也提供了事务处理的机制。一、事务的特点事务具有以下四个特点,通常用ACID来概括...
    99+
    2023-10-22
    MySQL 事务 处理
  • MySQLFlinkWatermark实现事件时间处理的关键技术
    目录1.概述2.SQL案例-演示Watermark为零的情况3.SQL案例-演示Watermark不为零的情况1.概述 生活中有种场景: 车辆进入隧道,信号不好,出了隧道后,信号就正...
    99+
    2023-05-19
    MySQL Flink Watermark事件时间处理 Flink Watermark
  • Python中怎么实现自动化处理文件
    Python中怎么实现自动化处理文件,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。遍历一个目录中的文件如果有如下多个数据需要读取和处理:├── data ...
    99+
    2023-06-15
  • JavaScript中的事件冒泡与捕获怎么实现
    这篇文章主要讲解了“JavaScript中的事件冒泡与捕获怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript中的事件冒泡与捕获怎么实...
    99+
    2022-10-19
  • 聊聊Node中的异步实现与事件驱动
    对于某些场景有一些互不相关的任务需要完成,现行的主流方法有如下两种:多线程并行完成:多线程的代价在于创建线程和执行线程上下文切换的开销较大。另外,在复杂的业务中,多线程编程经常面临锁、状态同步等问题;单线程顺序执行:易于表达,但串行执行的缺...
    99+
    2022-11-22
    前端 后端 Node.js
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作