首次发表在我的博客react
<input type="text" value={this.state.value} onChange={(e) => { this.setState({ value: e.target.value.toUpperCase(), }); }} />
<input>
或<select>
都要绑定一个change事件;每当表单的状态发生变化,都会被写入组件的state中,这种组件在React中被称为受控组件;在受控组件中,组件渲染出的状态与它的value或者checked prop向对应.react经过这种方式消除了组件的局部状态,是的应用的整个状态可控.react官方一样推荐使用受控表单组件,总结下React受控组件更新state的流程:架构
react中数据是单向流动的.从示例中,咱们能看出来表单的数据来源于组件的state,并经过props传入,这也称为单向数据绑定.而后,咱们又经过onChange事件处理器将新的表单数据写回到state,完成了双向数据绑定.性能
import React, { Component } from 'react'; class UnControlled extends Component { handleSubmit = (e) => { console.log(e); e.preventDefault(); console.log(this.name.value); } render() { return ( <form onSubmit={this.handleSubmit}> <input type="text" ref={i => this.name = i} defaultValue="BeiJing" /> <button type="submit">Submit</button> </form> ); } } export default UnControlled;
将输入的字母转化为大写展现this
<input type="text" value={this.state.value} onChange={(e) => { this.setState({ value: e.target.value.toUpperCase(), }); }} />
直接展现输入的字母code
<input type="text" defaultValue={this.state.value} onChange={(e) => { this.setState({ value: e.target.value.toUpperCase(), }); }} />
在受控组件中,每次表单的值发生变化,都会调用一次onChange事件处理器,这确实会带来性能上的的损耗,虽然使用费受控组件不会出现这些问题,但仍然不提倡使用非受控组件,这个问题能够经过Flux/Redux应用架构等方式来达到统一组件状态的目的.orm
使用受控组件须要为每个组件绑定一个change事件,而且定义一个事件处理器来同步表单值和组件的状态,这是一个必要条件.固然,某些状况能够使用一个事件处理器来处理多个表单域对象
import React, { Component } from 'react'; class Controlled extends Component { constructor(...args) { super(...args); this.state = { name: 'xingxing', age: 18, }; } handleChange = (name, e) => { const { value } = e.target; this.setState({ [name]: value, }); } render() { const { name, age } = this.state; return ( <div> <input type="text" value={name} onChange={this.handleChange.bind(this, 'name')} /> <input type="text" value={age} onChange={this.handleChange.bind(this, 'age',)} /> </div> ); } } export default Controlled;
React的form组件提供了几个重要的属性,用来显示组件的状态事件
当状态属性改变时会触发onChange事件属性.受控组件中的change事件与HTML DOM中提供的input事件更为相似;get