内容简介: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 渲染回调(函数作为子组件)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Google's PageRank and Beyond
Amy N. Langville、Carl D. Meyer / Princeton University Press / 2006-7-23 / USD 57.50
Why doesn't your home page appear on the first page of search results, even when you query your own name? How do other web pages always appear at the top? What creates these powerful rankings? And how......一起来看看 《Google's PageRank and Beyond》 这本书的介绍吧!