我们现在渲染一个 LoginForm
表单来作为例子:
import React, { Component } from 'react';
class LoginForm extends Component {
state = {
account: {username: '', password: ''}
};
handleSubmit = (e) => {
e.preventDefault();
// 一般在这 ajax 请求服务器
console.log(e);
};
handleChange = (e) => {
let account = {...this.state.account};
account[e.currentTarget.name] = e.currentTarget.value;
this.setState({account});
};
render() {
return (
<div>
<form onSubmit={this.handleSubmit}>
<div>
<label htmlFor="username">Username</label>
<input
id='username'
name='username'
type="text"
value={this.state.account.username}
onChange={this.handleChange}
/>
</div>
<div>
<label htmlFor="password">Password</label>
<input
id='password'
name='password'
type="password"
value={this.state.account.password}
onChange={this.handleChange}
/>
</div>
<button>Login</button>
</form>
</div>
);
}
}
export default LoginForm;
input
元素中我们设置的 value={this.state.account.username}
,意味着 input
的值直接从 state
读取,input
中没有了自己的 state
,这样的元素叫受控元素。
对于受控元素的 value
,不能使用 null
和 undefined
。所以我们初始化 username
和 password
的时候要使用空字符串。
每一个 form
元素都有一个 onSubmit
事件,这里我们定义为 handleSubmit()
函数。其参数 e
为事件对象本身(事件对象详细见:官方文档)。
函数 e.preventDefault()
表示阻止事件的 HTML 默认行为,比如这里点击按钮后的提交表单发起 HTTP 请求并重载整个页面的行为。
input
标签中的 onChange
事件,当 input
改变后就会执行,其参数 e
也是事件对象本身。我们使用 e.currentTarget
来获取 input
的当前参数(详细见:官方文档),并把它同步到 LoginForm
的 state
中,以方便对输入数据的进一步处理。
网友评论