Uncontrolled components are inputs that do not have a value
property. In opposite to controlled components, it is the application's responsibility to keep the component state and the input value in sync.
class Form extends React.Component {
constructor(props) {
super(props);
this.onChange = this.onChange.bind(this);
this.state = {
name: 'John'
};
}
onChange(e) {
this.setState({
name: e.target.value
});
}
render() {
return (
<div>
<label for='name-input'>Name: </label>
<input
id='name-input'
onChange={this.onChange}
defaultValue={this.state.name} />
</div>
)
}
}
Here, the component's state is updated via the onChange
event handler, just as for controlled components. However, instead of a value
property, a defaultValue
property is supplied. This determines the initial value of the input during the first render. Any subsequent changes to the component's state are not automatically reflected by the input value; If this is required, a controlled component should be used instead.