包含表单的组件分类
a. 受控组件: 表单项输入数据能自动收集成状态
b. 非受控组件: 需要时才手动读取表单输入框中的数据
下述代码中, <input type="text" value={this.state.username} onChange={this.handleChange} />
采用受控组件, 自动将输入框的内容收集进入状态.
<input type="password" ref={(input) => this.pwdInput = input} />
采用 非受控组件, 需要时才手动读取表单输入框中的数据. 必须点击submit后才提交
React 的官方文档:
在大多数情况下,我们推荐使用 受控组件 来处理表单数据。在一个受控组件中,表单数据是由 React 组件来管理的。另一种替代方案是使用非受控组件,这时表单数据将交由 DOM 节点来处理。
如果你不介意代码美观性,并且希望快速编写代码,使用非受控组件往往可以减少你的代码量。否则,你应该使用受控组件。
使用受控组件更符合react的思想,少使用DOM
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| /* 1. 问题: 在react应用中, 如何收集表单输入数据 2. 包含表单的组件分类 受控组件 非受控组件 */ /* 需求: 自定义包含表单的组件 1. 界面如下所示 2. 输入用户名密码后, 点击登陆提示输入信息 3. 不提交表单 */ class LoginForm extends React.Component { constructor(props) { super(props) this.state = { username: '' } this.handleSubmit = this.handleSubmit.bind(this) this.handleChange = this.handleChange.bind(this) }
handleChange(event) { //event表示当前事件, event.target表示触发该事件的元素 this.setState({username: event.target.value}) }
handleSubmit(event) { alert(`准备提交的用户名为: ${this.state.username}, 密码:${this.pwdInput.value}`)
// 阻止事件的默认行为: 提交表单 event.preventDefault() } render () {
return ( //处理submit事件 <form onSubmit={this.handleSubmit} action="/test"> <label> 用户名: <input type="text" value={this.state.username} onChange={this.handleChange} /> //value绑定输入框与state中的数据, 只有添加onChange之后才能变化. </label> <label> 密码: <input type="password" ref={(input) => this.pwdInput = input} /> </label> <input type="submit" value="登陆" /> </form> ) } }
ReactDOM.render(<LoginForm />, document.getElementById('example'))
|