React 收集表单数据

1. 非受控组件

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>
		);
	}
}

2. 受控组件

class Login extends React.Component {
	//初始化状态
	state = {
		username: '', //用户名
		password: '', //密码
	};

	//保存用户名到状态中
	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;
		console.log(`你输入的用户名是:${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>
		);
	}
}

1. 高阶函数

如果一个函数符合下面2个规范中的任何一个,那该函数就是高阶函数:

  • A函数,接收的参数是一个函数,那么A就可以称之为高阶函数。
  • A函数,调用的返回值依然是一个函数,那么A就可以称之为高阶函数。

常见的高阶函数有:PromisesetTimeoutarr.map()等等。

2. 函数柯里化

通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式。

function sum(a){
	return(b)=>{
		return (c)=>{
			return a+b+c;
		}
	}
}

3. 函数柯里化实现表单数据收集

class Login extends React.Component {
	//初始化状态
	state = {
		username: '', //用户名
		password: '', //密码
	};

	//保存表单数据到状态中
	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" />
				密码:
				<input onChange={this.saveFormData('password')} type="password" name="password" />
				<button>登录</button>
			</form>
		);
	}
}

4. 改进

class Login extends React.Component {
	//初始化状态
	state = {
		username: '', //用户名
		password: '', //密码
	};

	//保存表单数据到状态中
	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" />
				密码:
				<input onChange={event => this.saveFormData('password', event)} type="password" name="password" />
				<button>登录</button>
			</form>
		);
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

火星飞鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值