不可控器件(Uncontrolled Components)基本上是React应用程序中的输入表单元素,其值不受React组件状态的控制,因此其值不受React组件状态的控制。当它们的值需要由React组件处理时,您需要在处理程序中手动提取它们的值并使用其值更新状态。
不受控组件的典型用法是表单输入元素,如和
class NameForm extends React.Component { constructor(props) {
super(props);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleSubmit(event) {
alert('A name was submitted: ' + this.input.value);
event.preventDefault();
}
render() {
return (
<form onSubmit={this.handleSubmit}>
<label>
Name:
<input type="text" ref={(input) => this.input = input />
</label>
<input type="submit" value="Submit" />
</form>
);
}
}
在 HTML 中, 元素的 value 属性表示渲染此输入的初始值。在 React 中,不受控制的组件反映了其初始值;一次设置后不再监视值的更改。只有在初始设置时使用默认值的情况下才应该使用不受控组件;在其他情况下,应该使用受控组件。
render() { return (
<form onSubmit={this.handleSubmit}>
<label>
Name:
<input defaultValue="Bob" type="text" ref={(input) => this.input = input />
</label>
<input type="submit" value="Submit" />
</form>
);
}
虽然这样做可以直接读取DOM节点,但它仅限于简单的快速用例。如果代码需要更具可读性、可维护性和扩展性,那么就要自己处理表单值,并使用受控制的组件替代不受控制的表单输入。这样,您将完全控制表单数据,并能够以自己的方式验证和提交表单。
class NameForm extends React.Component { constructor(props) {
super(props);
this.state = {value: ''};
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(event) {
this.setState({value: event.target.value});
}
handleSubmit(event) {
alert('A name was submitted: ' + this.state.value);
event.preventDefault();
}
render() {
return (
<form onSubmit={this.handleSubmit}>
<label>
Name:
<input type="text" value={this.state.value} onChange={this.handleChange} />
</label>
<input type="submit" value="Submit" />
</form>
);
}
}
不可控器件作为React的一种输入表单元素,其值不受React状态的控制,所以需要手动提取其值并使用其值更新状态。不受控组件的典型用法是表单输入元素,如果要处理表单值,并使用受控制的组件替代不受控制的表单输入。