react input 不设置onChange的常见错误截图前端
表单是前端很是重要的一块内容,而且每每包含了错误校验等逻辑。
React对表单元素作了专门的优化处理,他对表单元素作了一些抽象,使得他们的使用方式更统一更规范。react
表单里面出来了一个新的概念叫“约束性组件”。那么如何理解约束性组件和非约束性组件呢。优化
约束性组件,简单的说,就是由react管理了它的value,而非约束性组件的value就是原生的DOM管理的。
他们的写法上也有很大区别。this
非约束性组件这么写:spa
<input type="text" defaultValue="a" />
这个 defaultValue
其实就是原生DOM中的 value
属性。这样写出的来的组件,其value值就是用户输入的内容,React彻底无论理输入的过程。.net
而约束性组件是这么写的:code
<input type="text" value={this.state.name} onChange={this.handleChange} /> //...省略部分代码 handleChange: function(e) { this.setState({name: e.target.value}); }
这里,value属性再也不是一个写死的值,他是 this.state.name
,而 this.state.name
是由 this.handleChange
负责管理的。
这个时候实际上 input 的 value 根本不是用户输入的内容。而是onChange 事件触发以后,因为 this.setState 致使了一次从新渲染。不过React会优化这个渲染过程,实际它依然是经过设置input的value来实现的。blog
可是必定要注意,约束性组件显示的值和用户输入的值虽然不少时候是相同的,但他们根本是两码事。约束性组件显示的是 this.state.name
的值。你能够在handleChange中对用户输入的值作任意的处理,好比你能够作错误校验。事件
对比约束性组件和非约束性组件的输入流程:get
非约束性组件: 用户输入A -> input 中显示A
约束性组件: 用户输入A -> 触发onChange事件 -> handleChange 中设置 state.name = “A” -> 渲染input使他的value变成A
正式由于这样,强烈推荐使用约束性组件,由于它能更好的控制组件的生命流程。