react学习---day04--高阶函数与函数柯里化

需求: 还是那个登录功能,但是我现在不想一直执行e.target.value这句代码,假设我有十个输入框那我就需要写十句这样的代码
可以将saveUserName与savePassWord写成一个方法,只需要将他们的标识作为一个参数传入进去
1 <input onChange={this.savaFormData("userName")} type="text" placeholder="用户名" />
2 <input onChange={this.savaFormData("passWord")} type="text" placeholder="密码" />
3 <button onClick={this.login}>登录</button>

这样在savaFormData方法里面就可以分辨出谁是userName谁是passWord

savaFormData = (type) => {

}
但是有一个问题,直接这样写的话是拿不到input的value的
react底层处理表达式是直接执行且携带参数的(this.savaFormData(userName))是不能直接拿到event的,
因为在底层是将this.savaFormData(userName)方法的返回值绑定在了onChange里面,也就是说如果是直接执行且携带参数的只有在返回值中可以拿到event
此时只需要利用返回值是一个函数问题迎刃而解
savaFormData = (type) => {
    return (e) => {
        this.setState({
            [type]: e.target.value
        })
    }
}

整体代码为:

 1 class App extends React.Component {
 2     state = {
 3         userName: '',
 4         passWord: ''
 5     }
 6     savaFormData = (type) => {
 7         return (e) => {
 8             this.setState({
 9                 [type]: e.target.value
10             })
11         }
12     }
13     login = () => {
14         alert(`用户名为: ${this.state.userName};密码为: ${this.state.passWord}`)
15     }
16     render() {
17         return (
18             <div>
19                 <input onChange={this.savaFormData("userName")} type="text" placeholder="用户名" />
20                 <input onChange={this.savaFormData("passWord")} type="text" placeholder="密码" />
21                 <button onClick={this.login}>登录</button>
22             </div>
23         )
24     }
25 }
26 ReactDOM.render(<App />, document.getElementById("app"))

高阶函数其实在日常中也是经常使用的,引用大佬的话来说高阶函数是那些操作其他函数的函数。用最简单的话来说,高阶函数就是一个将函数作为参数或者返回值的函数。

所以其实很多方法也是高阶函数例如: setTimeOut(()=>{}); 数组的map()和forEach()等等

 

柯里化,英语:Currying(果然是满满的英译中的既视感),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

 1 // 普通函数
 2 function add(a, b) {
 3     return console.log(a+b)
 4 }
 5 
 6 // 柯里化之后的函数
 7 function curA(a) {
 8     return function(b) {
 9         return console.log(a+b)
10     }
11 }
12 
13 add(1, 2) // 3
14 curA(1)(3) // 3

通俗易懂就是: 通过函数调用的方式继续返回也是一个函数,实现了多次接收参数左后统一处理的函数形式就是柯里化:

1 savaFormData = (type) => {
2     return (e) => {
3         this.setState({
4             [type]: e.target.value
5         })
6     }
7 }

上面的代码便是柯里化函数

posted @ 2021-01-14 19:49  微笑着的代码狗  阅读(101)  评论(0)    收藏  举报