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 ...
随机推荐
- K8S系列第三篇(Docker网络)
目录 docker 网络 Docker 的四种网络模 一.网络基础 1.网络名称空间介绍 2.创建一个命名空间 1)Veth设备对 2)Veth设备操作 1> 创建Veth设备对 2> 绑 ...
- Linux 各个命令的缩写原型
cd:(change derictery)更换目录: pwd:(Print Working Directory)显示当前工作目录: mk:(make directory)创建目录: ...
- 版本号是通过import合并而来的,不是继承来的
- linux统计nginx日志中请求访问量命令
Nginx 三种分配策略:轮询.权重.ip_hash(比如你登录了一个网站,登录信息已经保存到 a 机器,但当你做后续操作时的请求会到 b 机器,那么就获取不到你原来登录的信息,此时你就需要重新登录了 ...
- 攻防世界逆向——game
攻防世界逆向:game wp 攻防世界逆向新手区的一道题目. 是一道windows的creak,动态调试打开是这样的: 题目说明是让屏幕上所有的图像都亮之后,会出现flag,看来应该是可以玩出来的. ...
- MySQL 执行优化查询
查询执行的基础 当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的.当向MySQL发送一个请求的时候,MySQL执行过程如图1-1所示: 图1-1 查询执 ...
- 操作系统思考 第十一章 C语言中的信号量
第十一章 C语言中的信号量 作者:Allen B. Downey 原文:Chapter 11 Semaphores in C 译者:飞龙 协议:CC BY-NC-SA 4.0 信号量是学习同步的一个好 ...
- Greenplum数仓监控解决方案(开源版本)
Greenplum监控解决方案 基于Prometheus+Grafana+greenplum_exporter+node_exporter实现 关联图 一.基本概念 1.Prometheus Pr ...
- SpringCloud-技术专区-从源码层面让你认识Feign工作流程和运作机制
Feign工作流程源码解析 什么是feign:一款基于注解和动态代理的声明式restful http客户端. 原理 Feign发送请求实现原理 微服务启动类上标记@EnableFeignClients ...
- STM32—SysTick系统定时器
SysTick是STM32中的系统定时器,利用SysTick可以实现精确的延时. SysTick-系统定时器 属于 CM3 内核中的一个外设,内嵌在 NVIC 中.系统定时器是一个 24bit 的向下 ...