内容简介:1、受控组件在HTML当中,像我们通过使react变成一种单一数据源的状态来结合二者。React负责渲染表单的组件仍然控制用户后续输入时所发生的变化。相应的,其值由React控制的输入表单元素称为“受控组件”。
1、受控组件
在HTML当中,像 <input>
, <textarea>
, 和 <select>
这类表单元素会维持自身状态,并根据用户输入进行更新。但在React中,可变的状态通常保存在组件的状态属性中,并且只能用
setState()
方法进行更新。
我们通过使react变成一种单一数据源的状态来结合二者。React负责渲染表单的组件仍然控制用户后续输入时所发生的变化。相应的,其值由React控制的输入表单元素称为“受控组件”。
由于 value
属性是在我们的表单元素上设置的,因此显示的值将始终为 React数据源上 this.state.value
的值。由于每次按键都会触发 handleChange
来更新当前React的state,所展示的值也会随着不同用户的输入而更新。
<input type="text" value={this.state.value} onChange={this.handleChange} />复制代码
2、非受控组件
要编写一个非受控组件,而非为每个状态更新编写事件处理程序,你可以使用 ref 从 DOM 获取表单值。
在 React 的生命周期中,表单元素上的 value
属性将会覆盖 DOM 中的值。使用非受控组件时,通常你希望 React 可以为其指定初始值,但不再控制后续更新。要解决这个问题,你可以指定一个 defaultValue
属性而不是 value
。
<input type="text" defaultValue={'1232'} ref={this.input} />复制代码
举例:
class NameForm extends React.Component { constructor(props) { super(props); this.handleSubmit = this.handleSubmit.bind(this); this.handleChange = this.handleChange.bind(this); this.input = React.createRef(); this.state = { value:'567' } } handleSubmit(event) { alert('A name was submitted: ' + this.input.current.value); event.preventDefault(); } handleChange(e){ this.setState({value: e.target.value}); } render() { return ( <form onSubmit={this.handleSubmit}> <label> Name: <input type="text" defaultValue={'1232'} ref={this.input} /> <input type="text" value={this.state.value} onChange={this.handleChange} /> </label> <input type="submit" value="Submit" /> </form> ); } } ReactDOM.render( <NameForm />, document.getElementById('root') );复制代码
3、对比受控组件和非受控组件
将输入的字母转化为大写展示
<input type="text" value={this.state.value} onChange={(e) => { this.setState({ value: e.target.value.toUpperCase(), }); }} />复制代码
直接展示输入的字母
<input type="text" defaultValue={this.state.value} />复制代码
a、性能上的问题
在受控组件中,每次表单的值发生变化,都会调用一次onChange事件处理器,这确实会带来性能上的的损耗,虽然使用费受控组件不会出现这些问题,但仍然不提倡使用非受控组件,这个问题可以通过Flux/Redux应用架构等方式来达到统一组件状态的目的.
b、是否需要事件绑定
使用受控组件需要为每一个组件绑定一个change事件,并且定义一个事件处理器来同步表单值和组件的状态,这是一个必要条件.当然,某些情况可以使用一个事件处理器来处理多个表单域
import React, { Component } from 'react'; class Controlled extends Component { constructor(...args) { super(...args); this.state = { name: 'xiaoming', 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;复制代码
参考:
https://segmentfault.com/a/1190000012404114#articleHeader2
https://react.docschina.org/docs/uncontrolled-components.html
以上所述就是小编给大家介绍的《React之受控组件与非受控组件》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 浅谈react受控组件与非受控组件(小结)
- React组件的受控和非受控
- Edge 浏览器曝高危漏洞,受控电脑可执行任意命令
- 使用DDL注入绕过Windows 10受控文件夹访问保护
- 谷安1904期PRINCE2(受控环境下的项目管理)认证培训圆满结束,北京深圳两地开班
- React 组件模式-有状态组件 x 无状态组件、容器组件 x 展示组件、高阶组件 x 渲染回调(函数作为子组件)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
内容创业:内容、分发、赢利新模式
张贵泉、张洵瑒 / 电子工业出版社 / 2018-6 / 49
越来越多的内容平台、行业巨头、资本纷纷加入内容分发的战争中,竞争非常激烈。优质的原创性内容将成为行业中最宝贵的资源。在这样的行业形势下,如何把内容创业做好?如何提高自身竞争力?如何在这场战争中武装自己?是每一位内容创业者都应该认真考虑的问题。 《内容创业:内容、分发、赢利新模式》旨在帮助内容创业者解决这些问题,为想要进入内容行业的创业者出谋划策,手把手教大家如何更好地进行内容创业,获得更高的......一起来看看 《内容创业:内容、分发、赢利新模式》 这本书的介绍吧!