前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >React--12:高阶函数

React--12:高阶函数

作者头像
用户4793865
发布2023-01-12 14:21:49
6500
发布2023-01-12 14:21:49
举报
文章被收录于专栏:前端小菜鸡yym前端小菜鸡yym

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

1. 引入

首先上篇文章的代码

代码语言:javascript
复制
class Login extends React.Component{
    state ={
        username:'',
        password:''
    }
    handleSubmit = (event)=>{
        event.preventDefault() // 阻止提交
        const {username,password} = this.state
        alert(`用户名是:${username}密码是:${password}`)
    }
    saveUsername = (event)=>{
        console.log(event.target.value)
        this.setState({username:event.target.value})
    }
    savePassword = (event)=>{
        this.setState({password:event.target.value})
    }
    render(){
        return(
            <form action="" onSubmit={this.handleSubmit}>
                用户名:<input onChange={this.saveUsername} type="text" name="username"/>
                密码:<input onChange={this.savePassword} type="text" name="password"/>
                <button>登陆</button>
            </form>
        )
    }
}

合并方法

saveUsername 和 savePassword 都是在往状态中写入值。那么现在我们把他们写成一个方法 saveFormData,并用传参进行区分标识。

代码语言:javascript
复制
 用户名:<input onChange={this.saveFormData('username')} type="text" name="username"/>
 密码:<input onChange={this.saveFormData('password')} type="text" name="password"/>

那 现在 saveFormData 接收的event参数是什么?肯定不是事件了。

代码语言:javascript
复制
  saveFormData = (event)=>{
        console.log(event)
        // this.setState({username:event.target.value})
    }

我们打印后发现,是传入的两个参数 username 和 password。 并且在我们还没在输入框输入任何东西的时候就已经打印了、输入内容的时候也没任何反应了。因为什么呢?我们前几篇文章中提到过。onChange={this.saveFormData('username')}将saveFormData的返回值(返回值为undefined),作为回调交给onChange事件。而不是 saveFormData 作为回调交给onChange事件。

那往下就进行不下去了?首先,因为执行不下去是因为saveFormData 的返回值是 undefined。那只要让它的返回值不是 undefined 就好了,我们让saveFormData 返回函数。

2. 高阶函数

更改回调

改造一下 saveFormData

代码语言:javascript
复制
saveFormData = (event)=>{
        return ()=>{
            console.log("sss")
        }
    }

现在,在输入框中输入文字,就会打印 sss。因为现在交给onChange事件作为回调的是 saveFormData的返回值--函数。

在这里插入图片描述
在这里插入图片描述

传递的参数也不再是事件event了,而是 username 或 password。我们将event改成 keyType。

🤔 onChange 的回调是红色框 还是 蓝色框 ?是蓝色框中的内容。那么接收event参数的就应该是 蓝色框的内容。

在这里插入图片描述
在这里插入图片描述

接收参数

代码语言:javascript
复制
saveFormData = (keyType)=>{
        console.log(keyType)
        return (event)=>{
            console.log(event.target.value)
        }
    }

可以看到已经接收到了输入框中的内容,并且也获得了数据的类型/键

在这里插入图片描述
在这里插入图片描述

存入状态

将数据存入 状态中。当我们在输入框中输入,会在React开发者工具中发现新增了一个键 keyType,新的值 11

代码语言:javascript
复制
this.setState({keyType:event.target.value})
在这里插入图片描述
在这里插入图片描述

那么怎么办?将 keyType 加上方括号,看下效果是我们想要的。

代码语言:javascript
复制
 this.setState({[keyType]:event.target.value})
在这里插入图片描述
在这里插入图片描述

对象复习

那这个写法是什么意思呢?我们复习一下对象 我想要在obj中添加一个键为name。我先定义了一个变量 a,它的值是name。

代码语言:javascript
复制
let a = 'name'
let obj = {}
obj.a  = 'tom'    // {a:"tom"} 此时的键是a 并不是name
obj[a] = 'tom'    // {name:"tom"}  

同理state是一个对象,keyType 就相当于 a 。所以就需要这么写[keyType]:event.target.value

言归正传,我们这个小标题是高阶函数,讲到这里,saveFormData就是一个高阶函数。

高阶函数

如果一个函数符合下面2个规范中的一个就可称为高阶函数 1.若A函数,接收的参数是一个函数,那么A就可以称为高阶函数。 2.若A函数,调用的返回值依然是一个函数,那么A就可以称为高阶函数。

saveFormData正是复合了2

常见的高阶函数有哪些? Promise 、setTimeout、arr.map()

函数的柯里化

通过函数继续返回函数的方式,实现多次接收参数最后同意处理的函数编码形式。 (前提:得是函数) 例子:求和

代码语言:javascript
复制
function sum(a,b,c){
    return a+b+c
}
sum(1,2,3)

那么柯里化怎么写

代码语言:javascript
复制
function sum (a){
    return (b)=>{
        return(c)=>{
            return a+b+c
        }
    }
}
sum(1)(2)(3)

而我们上面的

代码语言:javascript
复制
saveFormData = (keyType)=>{
        console.log(keyType)
        return (event)=>{
            console.log(event.target.value)
        }
    }

也是柯里化。

完整代码

代码语言:javascript
复制
class Login extends React.Component {
    state = {
        username: '',
        password: ''
    }
    handleSubmit = (event) => {
        event.preventDefault() // 阻止提交
        const { username, password } = this.state
        alert(`用户名是:${username}密码是:${password}`)
    }
    saveFormData = (keyType,value)=>{
        console.log(keyType)
        return (event)=>{
            console.log(keyType,event.target.value)
            this.setState({[keyType]:event.target.value})
        }
    }
    render() {
        return (
            <form action="" onSubmit={this.handleSubmit}>
                用户名:<input onChange={(this.saveFormData('username'))} type="text" name="username" />
                密码:<input onChange={this.saveFormData('password')} type="text" name="password" />
                <button>登陆</button>
            </form>
        )
    }
}

不使用柯里化

如果,同时接到 keyType 和 event 两个参数 。并且,把函数给onChange作为回调。onChange需要一个函数,我们给它 ()=>{ },我们在箭头函数函数中去调用saveFormData。这个箭头函数是可以接受到event的。

代码语言:javascript
复制
onChange={(event)=>{this.saveFormData('username',event)}}

在saveFormData函数中就可以接收到这两个参数

代码语言:javascript
复制
 saveFormData = (keyType,event)=>{
       console.log(keyType,event)
       this.setState({[keyType]:event.target.value})
    }

完整代码

代码语言:javascript
复制
class Login extends React.Component {
    state = {
        username: '',
        password: ''
    }
    handleSubmit = (event) => {
        event.preventDefault() // 阻止提交
        const { username, password } = this.state
        alert(`用户名是:${username}密码是:${password}`)
    }

    saveFormData = (keyType,event)=>{
        console.log(keyType,event)
            this.setState({[keyType]:event.target.value})
    }
    render() {
        return (
            <form action="" onSubmit={this.handleSubmit}>
                用户名:<input onChange={(event)=>{this.saveFormData('username',event)}} type="text" name="username" />
                密码:<input onChange={(event)=>{this.saveFormData('password',event)}} type="text" name="password" />
                <button>登陆</button>
            </form>
        )
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 引入
    • 合并方法
    • 2. 高阶函数
      • 更改回调
        • 存入状态
          • 对象复习
            • 高阶函数
              • 函数的柯里化
                • 不使用柯里化
                相关产品与服务
                云开发 CLI 工具
                云开发 CLI 工具(Cloudbase CLI Devtools,CCLID)是云开发官方指定的 CLI 工具,可以帮助开发者快速构建 Serverless 应用。CLI 工具提供能力包括文件储存的管理、云函数的部署、模板项目的创建、HTTP Service、静态网站托管等,您可以专注于编码,无需在平台中切换各类配置。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档