react(尚硅谷)03-react中的事件处理,非受控组件,受控组件,高阶函数,函数柯里化

1、react中的事件处理
  • 时间处理通过onXxxx属性指定事件处理函数
  • react使用的是自定义(合成)事件,而不是使用原生dom时间
  • react中的事件是通过事件委托方式处理的(委托给组件最外层的元素)
  • 通过event.target得到发生事件的dom元素对象
  • 不要过度使用ref
2、非受控组件

包含表单的组件分类
a.受控组件
b.非受控组件

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <!--引入核心库,先核心库,在rect-dom操作dom库,最后babel注意顺序-->
  <script src="../js/react.development.js"></script>
  <script src="../js/react-dom.development.js"></script>
  <script src="../js/babel.min.js"></script>
  <script src="../js/prop-types.js"></script>
</head>
<body>
<div id="app">
</div>

<!--  下面不能默认写默认js,必须写type并且是bable,实际是jax -->
  <script type="text/babel">
    //创建类组件
  class Login extends React.Component{
    handleSubmit=(event)=>{
      event.preventDefault()

      const {username,password}=this
      alert(`您输入的用户名是${username.value},密码是:${password.value}`)

    }

    render(){
      return (
        <form onSubmit={this.handleSubmit}>
          <input type="text" ref={(currentNode)=>this.username=currentNode}name="username"/>
          <input type="text" ref={(currentNode)=>this.password=currentNode} name="password"/>
          <button>提交</button>
        </form>
      )
    }
  }
    //渲染类组件
    ReactDOM.render(<Login/>,document.getElementById('app'))

  </script>
</body>
</html>

3、受控组件

受控组件的数据,都维护在state里,随用随取,类似于vue里的双向数据绑定

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <!--引入核心库,先核心库,在rect-dom操作dom库,最后babel注意顺序-->
  <script src="../js/react.development.js"></script>
  <script src="../js/react-dom.development.js"></script>
  <script src="../js/babel.min.js"></script>
  <script src="../js/prop-types.js"></script>
</head>
<body>
<div id="app">
</div>

<!--  下面不能默认写默认js,必须写type并且是bable,实际是jax -->
  <script type="text/babel">
    //创建类组件
  class Login extends React.Component{
    state={
      username:'',
      password:''
    }
    handleSubmit=(event)=>{
      event.preventDefault()

      const {username,password}=this.state
      alert(`您输入的用户名是${username},密码是:${password}`)

    }

    saveUsername=(event)=>{
      this.setState({username:event.target.value})

    }
    savePassword=(event)=>{
      this.setState({password:event.target.value})
    }

    render(){
      return (
        <form onSubmit={this.handleSubmit}>
          <input type="text"  onChange={this.saveUsername} name="username"/>
          <input type="text"  onChange={this.savePassword}  name="password"/>
          <button>提交</button>
        </form>
      )
    }
  }
    //渲染类组件
    ReactDOM.render(<Login/>,document.getElementById('app'))

  </script>
</body>
</html>

4、高阶函数
  • 回调函数一定是一个函数名,而不是函数的执行调用(使用了小括号),因为执行人,在事件发生的时候去依据这个函数名去调用对应的函数
render(){
      return (
        <form onSubmit={this.handleSubmit}>
          <input type="text"  onChange={this.saveFormdata('username')} name="username"/>
          <input type="text"  onChange={this.saveFormdata('password')}  name="password"/>
          <button>提交</button>
        </form>
      )
    }
  • 有的时候在写的时候使用过了小括号,要区别对待,表面上看是直接调用了函数,但要进入到函数里看看他是不是返回了一个函数。如下
saveFormdata=(dataType)=>{
      return (event)=>{
        //为了能解析处dataType,需要把形参dataType用方括号括看起来
        this.setState({[dataType]:event.target.value})
      }
    }

以上函数实际上就是一个高阶函数

- 高阶函数的定义
如果一个函数符合下面2个规范中的任何一个,那么就是高阶函数
a、如果A函数,接收的参数是一个函数,那么A就可以称之为高阶函数
b、若果A函数,调用的返回值,依然是一个函数,那么A就可以称之为高阶函数

5、函数柯里化

通过函数继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式
以下代码实际就是柯里化的写法

saveFormdata=(dataType)=>{
      return (event)=>{
        //为了能解析处dataType,需要把形参dataType用方括号括看起来
        this.setState({[dataType]:event.target.value})
      }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值