You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.5 KiB
67 lines
2.5 KiB
8 years ago
|
---
|
||
|
id: uncontrolled-components
|
||
|
title: Uncontrolled Components
|
||
|
permalink: docs/uncontrolled-components.html
|
||
|
---
|
||
|
|
||
7 years ago
|
In most cases, we recommend using [controlled components](/docs/forms.html) to implement forms. In a controlled component, form data is handled by a React component. The alternative is uncontrolled components, where form data is handled by the DOM itself.
|
||
8 years ago
|
|
||
7 years ago
|
To write an uncontrolled component, instead of writing an event handler for every state update, you can [use a ref](/docs/refs-and-the-dom.html) to get form values from the DOM.
|
||
8 years ago
|
|
||
|
For example, this code accepts a single name in an uncontrolled component:
|
||
|
|
||
8 years ago
|
```javascript{8,17}
|
||
8 years ago
|
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}>
|
||
8 years ago
|
<label>
|
||
|
Name:
|
||
|
<input type="text" ref={(input) => this.input = input} />
|
||
|
</label>
|
||
8 years ago
|
<input type="submit" value="Submit" />
|
||
|
</form>
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
8 years ago
|
[Try it on CodePen.](https://codepen.io/gaearon/pen/WooRWa?editors=0010)
|
||
8 years ago
|
|
||
|
Since an uncontrolled component keeps the source of truth in the DOM, it is sometimes easier to integrate React and non-React code when using uncontrolled components. It can also be slightly less code if you want to be quick and dirty. Otherwise, you should usually use controlled components.
|
||
|
|
||
8 years ago
|
If it's still not clear which type of component you should use for a particular situation, you might find [this article on controlled versus uncontrolled inputs](http://goshakkk.name/controlled-vs-uncontrolled-inputs-react/) to be helpful.
|
||
|
|
||
8 years ago
|
### Default Values
|
||
|
|
||
|
In the React rendering lifecycle, the `value` attribute on form elements will override the value in the DOM. With an uncontrolled component, you often want React to specify the initial value, but leave subsequent updates uncontrolled. To handle this case, you can specify a `defaultValue` attribute instead of `value`.
|
||
|
|
||
8 years ago
|
```javascript{7}
|
||
8 years ago
|
render() {
|
||
|
return (
|
||
|
<form onSubmit={this.handleSubmit}>
|
||
8 years ago
|
<label>
|
||
|
Name:
|
||
|
<input
|
||
|
defaultValue="Bob"
|
||
|
type="text"
|
||
|
ref={(input) => this.input = input} />
|
||
|
</label>
|
||
8 years ago
|
<input type="submit" value="Submit" />
|
||
|
</form>
|
||
|
);
|
||
|
}
|
||
|
```
|
||
|
|
||
8 years ago
|
Likewise, `<input type="checkbox">` and `<input type="radio">` support `defaultChecked`, and `<select>` and `<textarea>` supports `defaultValue`.
|