高阶函数和函数柯里化

本文探讨了在React应用中如何通过创建一个高阶函数`saveFormData`来简化多个输入框onChange回调的编写。通过传入`dataType`参数来区分不同表单数据,但原始实现将值存储到了`dataType`属性中,而非预期的state字段。解决方案是使用对象字面量方式动态设置state。此外,文章还介绍了函数柯里化和高阶函数的概念,并提供了不使用柯里化的替代方案。
摘要由CSDN通过智能技术生成

在这里插入图片描述
对于这个例子,表单里面如果有很多输入框,那么就要写大量的onChange回调函数,并且这些回调函数除了名字其他都差不多,有没有办法可以简化?

我们把这些onChange的回调方法统一成一个saveFormData方法,这个方法接收一个dataType形参用来判断输入的是什么类型表单的数据,并且返回一个方法,这个return回来的匿名函数才是react会在onChange触发时候帮我们调用的,并且会传入当前事件源event
在这里插入图片描述
在这里插入图片描述
我们肯定不能在回调里面做打印这么无聊的事情,而是要在这里面保存值到状态:(注意这里是错误写法)
在这里插入图片描述
看下这样写会有什么问题:
在这里插入图片描述
问题出现了,username和password并没有存到对应的state里面去,而是传入了dataType这个属性中,程序似乎没有读出来dataType的值,而直接把它做为state中的属性名了!怎么办?

其实下面两种写法效果都是一样的:
在这里插入图片描述
在这里插入图片描述
最终state中都会有一个dataType的属性,而不会读取dataType的值,可以这样改:
在这里插入图片描述
在这里插入图片描述

我们这里复习一下对象的基本知识

在这里插入图片描述
我们想要obj里面存入{name: 'dean'},但是实际存入的是{a: 'dean'}
为了达成目标,只能这样写:
在这里插入图片描述

下面我们开始甩概念:什么是高阶函数

在这里插入图片描述

我们刚才定义的saveFormData方法,因为返回值还是一个函数,所以满足条件2,就是一个高阶函数
常见的高阶函数:

1.Promise

new Promise((resolve, reject) => {})

2.setTimeout

setTimeout(() => {})

3.数组相关的一些函数比如arr.map

函数柯里化:

在这里插入图片描述
在这里插入图片描述
那么如果我们不用函数柯里化也可以实现这个功能吗?
可以的,我们只要给onChange事件的回调指定一个匿名函数就可以了,这个匿名函数就会油react在触发onchange事件时候帮我们自动调用,并且传入event,这样我们就可以同时传入event和dataType到改造后的saveFormData方法里面了
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值