React --- 收集表单数据(非受控组件和受控组件)、函数柯里化

目录

需求:定义一个包含表单的组件,输入用户名密码后,点击登录提示输入信息(页面不刷新)

1.非受控组件

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8"></meta>
    <title></title>
  </head>
  <body>
    <div id="test"></div>

    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <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 ref={c => this.username = c} type="text" name="username"/>
              密码:<input ref={c => this.password = c} type="password" name="password"/>
              <button>登录</button>
            </form>
          )
        }
      }
      ReactDOM.render(<Login/>, document.getElementById('test'))
    </script>
  </body>
</html>

2.受控组件

对于这种像input这样输入类的DOM,随着用户的输入,输入的数据被维护在状态state里,等需要用的时候再从状态state里面取出来

类似于Vue中的双向数据绑定

受控组件的优势在于:比上面的非受控组件少用了refs

<script type="text/babel">
  class Login extends React.Component {
    //保存用户名和密码到状态中
    saveUsername = (event) => {
      this.setState({username: event.target.value})
    }
    savePassword = (event) => {
      this.setState({password: event.target.value})
    }
    handleSubmit = (event) => {
      event.preventDefault()
      const {username,password} = this.state
      alert(`你输入的用户名是:${username},你输入的密码是:${password}`)
    }
    render() {
      return (
        <form onSubmit={this.handleSubmit}>
          用户名:<input onChange={this.saveUsername} type="text" name="username"/>
          密码:<input onChange={this.savePassword} type="password" name="password"/>
          <button>登录</button>
        </form>
      )
    }
  }
  ReactDOM.render(<Login/>, document.getElementById('test'))
</script>

3.函数柯里化

函数柯里化(currying):通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式

 将我上面用受控组件写的例子改一下,下面的saveFormData函数就用到了函数柯里化

<script type="text/babel">
  class Login extends React.Component {
    //保存表单数据到状态中
    saveFormData = (dataType) => {
      return (event) => {
        this.setState({[dataType]:event.target.value})
      }
    }
    handleSubmit = (event) => {
      event.preventDefault()
      const {username,password} = this.state
      alert(`你输入的用户名是:${username},你输入的密码是:${password}`)
    }
    render() {
      return (
        <form onSubmit={this.handleSubmit}>
          用户名:<input onChange={this.saveFormData('username')} type="text" name="username" autoComplete="off"/>
          密码:<input onChange={this.saveFormData('password')} type="password" name="password"/>
          <button>登录</button>
        </form>
      )
    }
  }
  ReactDOM.render(<Login/>, document.getElementById('test'))
</script>

不用柯里化,我再改一下

<script type="text/babel">
  class Login extends React.Component {
    //保存表单数据到状态中
    saveFormData = (dataType, event) => {
      this.setState({[dataType]:event.target.value})
    }
    handleSubmit = (event) => {
      event.preventDefault()
      const {username,password} = this.state
      alert(`你输入的用户名是:${username},你输入的密码是:${password}`)
    }
    render() {
      return (
        <form onSubmit={this.handleSubmit}>
          用户名:<input onChange={event => this.saveFormData('username', event)} type="text" name="username" autoComplete="off"/>
          密码:<input onChange={event => this.saveFormData('password', event)} type="password" name="password"/>
          <button>登录</button>
        </form>
      )
    }
  }
  ReactDOM.render(<Login/>, document.getElementById('test'))
</script>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漂流の少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值