区分
判断一个组件是否是受控组件,看这个组件是否受
react
状态控制。在
react
中,Input
textarea
等组件默认是非受控组件(输入框内部的值是用户控制,和 React 无关)但是也可以转化成受控组件,就是通过onChange
事件获取当前输入内容,将当前输入内容作为 value 传入,此时就成为受控组件。
受控组件
受控组件,顾名思义是受到控制的组件,那么是通过什么来受到控制呢?
代码如下👇
<input value={this.state.value} />
当input
的value
值为state.value
时,当用户对input
进行操作时,没有对value
进行setState()
操作,这个值不变,也就意味着input
显示不变。但是如果我们给input
一个事件,在事件中进行对state
的修改,那么值会如何呢?
代码如下👇
handleChange = e => this.setState({value: e.target.value})
render() {
return (
<input value="this.state.value" onChange={this.handleChange}/>
)
}
每当用户输入时,input
触发onChange
事件,调用handleChange
函数修改了value
值。使用受控组件,每个状态的改变都有一个与之相关的处理函数。好处是可以直接修改或验证用户输入。
非受控组件
非受控组件不同于受控组件数据是react
组件处理的,是通过dom
自己内部进行处理。
代码如下👇
class Example extends React.Component {
handleSubmit = (e) => {
console.log(this.input.value);
e.preventDefault();
}
render() {
return (
<>
<input type="text" ref={(input) => (this.input = input)} />
<button onClick={handleSubmit}>提交</button>
</>
);
}
}
此时将input
通过ref
暴露给组件,可以通过this.input
进行访问。