3.React事件处理、收集表单数据、高阶函数

3.1事件处理

    class Demo extends React.Component {

        /*
1. 通过onXxx属性指定事件处理函数(注意大小写)
a) React使用的是自定义(合成)事件, 而不是使用的原生DOM事件
----为了更好的兼容性
b) React中的事件是通过事件委托方式处理的(委托给组件最外层的元素)
----为了高效
2. 通过event.target得到发生事件的DOM元素对象
----不要过度使用ref */ // 创建ref容器
myRef = React.createRef() showData = () => {
console.log(this.myRef.current)
alert(this.myRef.current.value)
} // 回到函数接收一个事件源
showData2 = (event) => {
console.log(event.target)
alert(event.target.value)
}
render(){
return (
<div>
<label>
<input ref={this.myRef} type="text" placeholder="点击按钮显示数据" />
</label>&nbsp;
<button onClick={this.showData}>点我提示左侧的数据</button>&nbsp;
{/* 要取的数据在发生事件的事件源,可以省略ref */}
<input onBlur={this.showData2} type="text" placeholder="失去焦点显示数据" />
</div>
)
}
} ReactDOM.render(<Demo />, document.getElementById('test'))

3.2 非受控组件

    class Login extends React.Component {

        // 非受控: 现用现取不通过state更新
handleSubmit = (event) => {
event.preventDefault() // 阻止表单提交
const {username, password} = this
alert(`${username.value}, ${password.value}`)
} render(){
return (
<form action="http://www.baidu.com" 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>
)
}
}

3.3 受控组件

    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 action="http://www.baidu.com" onSubmit={this.handleSubmit}>
用户名: <input onChange={this.saveUsername} type="text" name="username"/>
密码: <input onChange={this.savePassword} type="password" name="password"/>
<button>登录</button>
</form>
)
}
}

3.4函数柯里化(高阶函数)

     /*
高阶函数:符合以下之一,即为高阶函数
1.若A函数,接收的参数是一个函数,那么A就可以称之为高阶函数
2.若A函数,调用后的返回值依然是一个函数,那么A即可以称之为高阶函数
常见的高阶函数有 Promise,setTimeout, arr.map() 函数的柯里化:通过函数调用继续返回函数的方式,实现多次接收函数最后统一处理的函数编码形式
function sum(a) {
return (b) => {
return (c) => {
return a + b + c
}
}
}
const result = sum(1)(2)(3)
console.log(result)
* */ class Login extends React.Component { // 初始化状态
state = {
username: '',
password: ''
} // 受控: 随着输入立刻更新状态
handleSubmit = (event) => {
event.preventDefault() // 阻止表单提交
const {username, password} = this.state
alert(`${username}, ${password}`)
} // 保存表单数据到状态中
saveFormData = (dataType) => { // 返回一个回调函数给onChange,接收event事件
return (event) => {
// console.log(dataType)
// console.log(event.target.value)
this.setState({
[dataType]: event.target.value
})
}
} render(){
return (
<form action="http://www.baidu.com" onSubmit={this.handleSubmit}>
用户名: <input onChange={this.saveFormData('username')} type="text" name="username"/>
密码: <input onChange={this.saveFormData('password')} type="password" name="password"/>
<button>登录</button>
</form>
)
}
}

3.5 不使用函数柯里化实现

    class Login extends React.Component {

        // 初始化状态
state = {
username: '',
password: ''
} // 受控: 随着输入立刻更新状态
handleSubmit = (event) => {
event.preventDefault() // 阻止表单提交
const {username, password} = this.state
alert(`${username}, ${password}`)
} // 保存表单数据到状态中
saveFormData (event, dataType) {
console.log(this)
this.setState({
[dataType]: event.target.value
})
} render(){
return (
<form action="http://www.baidu.com" onSubmit={this.handleSubmit}>
{/*其实就是将回调函数抽出来写到这*/}
用户名: <input onChange={(event) => {this.saveFormData(event, 'username')}} type="text" name="username"/>
密码: <input onChange={(event) => {this.saveFormData(event, 'password')}} type="password" name="password"/>
<button>登录</button>
</form>
)
}
}

React事件处理、收集表单数据、高阶函数的更多相关文章

  1. (尚012)Vue表单数据的自动手集(表单数据提交,需要收集表单数据)

    自动收集,就是我一输入数据,就自动收集,等我点击提交按钮的时候,数据就收集好了 1.使用v-model对表单数据自动收集 1)text/textare----单行/多行输入框 2)checkbox-- ...

  2. 传统 HTML 表单数据的“整存整取”

    在日常开发中,涉及表单的处理司空见惯.过往,在取值和赋值的过程中,借助 jQuery 常常只是逐个控件进行操作,可惜这样开发效率并不高.那么能不能批量获取整个表单的值呢,以及批量为表单赋值. 一.取值 ...

  3. 《React后台管理系统实战 :一》:目录结构、引入antd、引入路由、写login页面、使用antd的form登录组件、form前台验证、高阶函数/组件

    实战 上接,笔记:https://blog.csdn.net/u010132177/article/details/104150177 https://gitee.com/pasaulis/react ...

  4. 使用jQuery实现跨域提交表单数据

    我们在WEB开发中有时会遇到这种情况,比如要从A网站收集用户信息,提交给B网站处理,这个时候就会涉及到跨域提交数据的问题.本文将给您介绍如何使用jQuery来实现异步跨域提交表单数据.   在jQue ...

  5. 如何发送HTML表单数据

    多数时候,HTML表单的目的只是为了把数据发给服务器,之后服务器再处理这些数据并发送响应给用户.虽然看起来挺简单的,但我们还是得注意一些事情以确保传送的数据不会破坏服务器.或者给你的用户制造麻烦. 数 ...

  6. ajax无刷新方式收集表单并提交表单

    ajax无刷新方式收集表单有两种方式, 一个是使用html5的FormData.一个是传统的方式. 一,FormData,在主流的浏览器中可以用,IE不好用啊. 另外,FormData使用有两个条件, ...

  7. React中的表单应用

    React中的表单应用 用户在表单填入的内容,属于用户跟组件的互动,所以不能用this.props读取. var Input = React.createClass({ //初始化组件数据 getIn ...

  8. react实战系列 —— React 中的表单和路由的原理

    其他章节请看: react实战 系列 React 中的表单和路由的原理 React 中的表单是否简单好用,受控组件和非受控是指什么? React 中的路由原理是什么,如何更好的理解 React 应用的 ...

  9. Servlet的5种方式实现表单提交(注册小功能),后台获取表单数据

    用servlet实现一个注册的小功能 ,后台获取数据. 注册页面: 注册页面代码 : <!DOCTYPE html> <html> <head> <meta ...

随机推荐

  1. js 正序、倒序、按字段排序方法

    js 基础--sort方法: arrayObject.sort(sortby); 参数:定义排序规则(正序.倒序.按字段排序)的函数: 返回值:对数组的引用.请注意,数组在原数组上进行排序,不生成副本 ...

  2. vulnhub-DC:2靶机渗透记录

    准备工作 在vulnhub官网下载DC:1靶机https://www.vulnhub.com/entry/dc-2,311/ 导入到vmware 打开kali准备进行渗透(ip:192.168.200 ...

  3. 第3天 IDEA 2021简单设置与优化 Java运算符 包机制

    IDEA 2021简单设置与优化 将工具条显示在上方 View–>Appearance–>Toolbar 鼠标悬停显示 File–>setting–>Editor–>Ge ...

  4. GetOverlappedResult 函数

    BOOL GetOverlappedResult( HANDLE hFile, LPOVERLAPPED lpOverlapped, LPDWORD lpNumberOfBytesTransferre ...

  5. jvm源码解读--16 锁_开头

    现在不太清楚, public static void main(String[] args) { Object object=new Object(); System.out.println(&quo ...

  6. cytoscape-d3-force api

    { animate:true,//是否在布局运行时显示布局:特殊的"结束"值使布局具有离散布局的动画效果 maxIterations:0,//布局退出前的最大迭代次数 maxSim ...

  7. Tomcat7+ 弱口令 && 后台getshell漏洞

    打开tomcat管理页面http://192.168.49.2:8080/manager/html,输入弱密码tomcat:tomcat,即可访问后台 先将jsp大马压缩为zip,再将zip后缀改名为 ...

  8. cmd MySQL登录

    mysql -uroot -p >Mysql -P 3306 -h 0.0.0.0 -u root -p 可远程访问

  9. 修改Eureka的metadata脚本

    最近研究了一下Spring Cloud的灰度发布, 发现方法真是多. 这里先提供一个修改Eureka注册中心里的instance实例的metadata的脚本, 可以方便地用来测试效果. 使用举例: s ...

  10. 解决移动端在IOS中input输入框光标过长

    在输入框样式中加入: line-height:20px;