内容简介: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 渲染回调(函数作为子组件)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Effective Java
Joshua Bloch / Addison-Wesley Professional / 2018-1-6 / USD 54.99
The Definitive Guide to Java Platform Best Practices—Updated for Java 9 Java has changed dramatically since the previous edition of Effective Java was published shortly after the release of Jav......一起来看看 《Effective Java》 这本书的介绍吧!
在线进制转换器
各进制数互转换器
XML、JSON 在线转换
在线XML、JSON转换工具