React事件处理、收集表单数据、高阶函数
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>
<button onClick={this.showData}>点我提示左侧的数据</button>
{/* 要取的数据在发生事件的事件源,可以省略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事件处理、收集表单数据、高阶函数的更多相关文章
- (尚012)Vue表单数据的自动手集(表单数据提交,需要收集表单数据)
自动收集,就是我一输入数据,就自动收集,等我点击提交按钮的时候,数据就收集好了 1.使用v-model对表单数据自动收集 1)text/textare----单行/多行输入框 2)checkbox-- ...
- 传统 HTML 表单数据的“整存整取”
在日常开发中,涉及表单的处理司空见惯.过往,在取值和赋值的过程中,借助 jQuery 常常只是逐个控件进行操作,可惜这样开发效率并不高.那么能不能批量获取整个表单的值呢,以及批量为表单赋值. 一.取值 ...
- 《React后台管理系统实战 :一》:目录结构、引入antd、引入路由、写login页面、使用antd的form登录组件、form前台验证、高阶函数/组件
实战 上接,笔记:https://blog.csdn.net/u010132177/article/details/104150177 https://gitee.com/pasaulis/react ...
- 使用jQuery实现跨域提交表单数据
我们在WEB开发中有时会遇到这种情况,比如要从A网站收集用户信息,提交给B网站处理,这个时候就会涉及到跨域提交数据的问题.本文将给您介绍如何使用jQuery来实现异步跨域提交表单数据. 在jQue ...
- 如何发送HTML表单数据
多数时候,HTML表单的目的只是为了把数据发给服务器,之后服务器再处理这些数据并发送响应给用户.虽然看起来挺简单的,但我们还是得注意一些事情以确保传送的数据不会破坏服务器.或者给你的用户制造麻烦. 数 ...
- ajax无刷新方式收集表单并提交表单
ajax无刷新方式收集表单有两种方式, 一个是使用html5的FormData.一个是传统的方式. 一,FormData,在主流的浏览器中可以用,IE不好用啊. 另外,FormData使用有两个条件, ...
- React中的表单应用
React中的表单应用 用户在表单填入的内容,属于用户跟组件的互动,所以不能用this.props读取. var Input = React.createClass({ //初始化组件数据 getIn ...
- react实战系列 —— React 中的表单和路由的原理
其他章节请看: react实战 系列 React 中的表单和路由的原理 React 中的表单是否简单好用,受控组件和非受控是指什么? React 中的路由原理是什么,如何更好的理解 React 应用的 ...
- Servlet的5种方式实现表单提交(注册小功能),后台获取表单数据
用servlet实现一个注册的小功能 ,后台获取数据. 注册页面: 注册页面代码 : <!DOCTYPE html> <html> <head> <meta ...
随机推荐
- 构建前端第9篇之(下)---vue3.0将template转化为render的过程
vue3.0将template转化为render的过程 这里是简单标记下,如何将.vue转换成js文件 具体的,先不研究了,太深,能力有限,达不到呢
- Spring in Action学习笔记(2)
Spring基础 AOP 面向切面编程 通知.连接点.切点.切面 Spring提供 4 种类型的AOP支持: 基于代理的经典SpringAOP:使用ProxyFactoryBean. 纯POJO切面: ...
- LinkedHashMap 与 LRUcache
LRU 缓存介绍 我们平时总会有一个电话本记录所有朋友的电话,但是,如果有朋友经常联系,那些朋友的电话号码不用翻电话本我们也能记住,但是,如果长时间没有联系了,要再次联系那位朋友的时候,我们又不得不求 ...
- Linux下Nginx基础应用
Nginx简介: Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.其将源代码以类BSD许可证的形式发布,因 ...
- 【Java经验分享篇01】小白如何开始学会看开源项目?
目录 前言 1.理解开源 1.1.什么是开源? 1.2.开源的定义 1.2.1.开源软件优点 1.2.2.经典开源软件案例 1.3.关于开源协议 1.3.1.如何选择开源协议 2.如何查找开源项目 2 ...
- IO多路复用详解
假如你想了解IO多路复用,那本文或许可以帮助你 本文的最大目的就是想要把select.epoll在执行过程中干了什么叙述出来,所以具体的代码不会涉及,毕竟不同语言的接口有所区别. 基础知识 IO多路复 ...
- noip模拟测试30
考试总结:这次考试,不是很顺利,首先看了一眼题目,觉得先做T1,想了一会觉得没什么好思路,就去打暴力,结果我不会枚举子集,码了半天发现不对,就随便交了一份代码上去,结果CE了,然后去打T3,20min ...
- 洛谷P1879题解
题面 显然是个状压DP. 看数据范围,不难发现算法复杂度应该是 \(O(n\times 2^n \times 2^n)\) . 显然第一个 \(n\) 是遍历每一行的土地. 后面两个 \(2^n\) ...
- Virustotal工具产品初研
一.产品新特点 1.群体智能 2.VT图 3.VT Yara 规则的生成与优化 4.内容搜索优化(大小及提交数量) 二.产品功能 1. --->安全管理员 威胁平台资源丰富 TIP .MISP ...
- Springboot通过拦截器拦截请求信息收集到日志
1.需求 最近在工作中遇到的一个需求,将请求中的客户端类型.操作系统类型.ip.port.请求方式.URI以及请求参数值收集到日志中,网上找资料说用拦截器拦截所有请求然后收集信息,于是就开始了操作: ...