一、定义
受控组件:
- 受控组件的值受React组件的state控制。
- 当用户输入内容时,组件会触发onChange事件,更新state,然后重新渲染组件。
- 应用场景:适用于需要在React中对输入进行严格控制和验证的情况,如表单输入项,可以方便地实现输入验证和逻辑处理。
非受控组件:
- 非受控组件的值不受React组件的state控制,而是由DOM本身管理。
- 通常通过ref获取DOM节点的值来进行操作。
- 应用场景:适用于一些简单的交互,或者需要与第三方库或原生API集成的情况,如使用第三方日期选择器或上传组件。
二、受控组件
受控组件,简单来讲,就是受我们控制的组件,组件的状态全程响应外部数据。
class TestComponent extends React.Component {
constructor (props) {
super(props);
this.state = { username: 'lindaidai' };
}
render () {
return <input name="username" value={this.state.username} />
}
}
这时候当我们在输入框输入内容的时候,会发现输入的内容并无法显示出来,也就是input
标签是一个可读的状态
这是因为value
被this.state.username
所控制住。当用户输入新的内容时,this.state.username
并不会自动更新,这样的话input
内的内容也就不会变了
如果想要解除被控制,可以为input
标签设置onChange
事件,输入的时候触发事件函数,在函数内部实现state
的更新,从而导致input
框的内容页发现改变
因此,受控组件我们一般需要初始状态和一个状态更新事件函数。
三、非受控组件
非受控组件,简单来讲,就是不受我们控制的组件
一般情况是在初始化的时候接受外部数据,然后自己在内部存储其自身状态
当需要时,可以使用ref
查询 DOM
并查找其当前值,如下:
import React, { Component } from 'react';
export class UnControll extends Component {
constructor (props) {
super(props);
this.inputRef = React.createRef();
}
handleSubmit = (e) => {
console.log('我们可以获得input内的值为', this.inputRef.current.value);
e.preventDefault();
}
render () {
return (
<form onSubmit={e => this.handleSubmit(e)}>
<input defaultValue="lindaidai" ref={this.inputRef} />
<input type="submit" value="提交" />
</form>
)
}
}
大部分时候推荐使用受控组件来实现表单,因为在受控组件中,表单数据由React
组件负责处理
如果选择非受控组件的话,控制能力较弱,表单数据就由DOM
本身处理,但更加方便快捷,代码量少。