Article image Forms and Controlled Components

18. Forms and Controlled Components

Page 62 | Listen in audio

In the world of React, handling forms and user inputs is a common task that often requires a bit of understanding of how React works with state and events. Forms in React can be controlled or uncontrolled. In this lesson, we will focus on controlled components, which are the recommended approach for handling forms in React.

In a traditional HTML form, the form elements themselves maintain their own state. For example, when a user types into an input field, the input element maintains its own state and updates the display accordingly. However, in React, we often want to keep the form data in the component's state so that we can have full control over the data and easily manipulate or validate it.

A controlled component is a component that renders form elements and controls them by keeping the form data in the component's state. This means that instead of relying on the DOM to manage the form state, we use React's state management. This approach provides a single source of truth for the form data, making it easier to manage and debug.

To create a controlled component, you need to do two things:

  1. Set the value of the form element to the state.
  2. Update the state when the form element changes.

Let's dive into an example to illustrate how controlled components work in React. Consider a simple form with an input field for a user's name:

class NameForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = { name: '' };

    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChange(event) {
    this.setState({ name: event.target.value });
  }

  handleSubmit(event) {
    alert('A name was submitted: ' + this.state.name);
    event.preventDefault();
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Name:
          <input type="text" value={this.state.name} onChange={this.handleChange} />
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}

In this example, we have a form with a single input field for the user's name. The component's state is initialized with an empty string for the name. The handleChange method updates the state with the value from the input field whenever it changes. The handleSubmit method is called when the form is submitted, and it displays an alert with the current name from the state.

The key aspect of this example is that the input field's value is set to the component's state (this.state.name), and the onChange event handler updates the state with the new input value. This makes the input a controlled component because its value is controlled by React's state.

Controlled components offer several advantages:

  • Single Source of Truth: The form data is stored in the component's state, making it easier to access and manipulate.
  • Validation: You can easily validate the form data before submission by checking the state.
  • Dynamic Inputs: You can dynamically change the form inputs based on the state.
  • Integration with Other Components: Since the form data is in the state, it can be easily passed to other components or used to update other parts of the application.

Let's expand our example to include multiple input fields and demonstrate how to handle different types of inputs, such as text, textarea, and select elements.

class ReservationForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      isGoing: true,
      numberOfGuests: 2
    };

    this.handleInputChange = this.handleInputChange.bind(this);
  }

  handleInputChange(event) {
    const target = event.target;
    const value = target.type === 'checkbox' ? target.checked : target.value;
    const name = target.name;

    this.setState({
      [name]: value
    });
  }

  render() {
    return (
      <form>
        <label>
          Is going:
          <input
            name="isGoing"
            type="checkbox"
            checked={this.state.isGoing}
            onChange={this.handleInputChange} />
        </label>
        <br />
        <label>
          Number of guests:
          <input
            name="numberOfGuests"
            type="number"
            value={this.state.numberOfGuests}
            onChange={this.handleInputChange} />
        </label>
      </form>
    );
  }
}

In this example, we have a form with a checkbox and a number input. The state is initialized with isGoing set to true and numberOfGuests set to 2. The handleInputChange method updates the state based on the input type and value. We use the name attribute of the input elements to identify which state property to update.

By using controlled components, we can easily manage the form data and ensure that the UI reflects the current state. This approach also makes it easy to add validation logic or perform other actions based on the form data.

React's controlled components provide a robust and flexible way to handle forms, making it easier to manage user input and ensure that your application's state is always in sync with the UI. By keeping the form data in the component's state, you gain full control over the data flow and can easily integrate with other parts of your application.

As you work with controlled components, you'll find that they offer a powerful way to manage forms and user input in React applications. By leveraging React's state management capabilities, you can create dynamic, interactive forms that respond to user input and provide a seamless user experience.

Now answer the exercise about the content:

What is a controlled component in React?

You are right! Congratulations, now go to the next page

You missed! Try again.

Article image Handling Forms and User Input

Next page of the Free Ebook:

63Handling Forms and User Input

7 minutes

Earn your Certificate for this Course for Free! by downloading the Cursa app and reading the ebook there. Available on Google Play or App Store!

Get it on Google Play Get it on App Store

+ 6.5 million
students

Free and Valid
Certificate with QR Code

48 thousand free
exercises

4.8/5 rating in
app stores

Free courses in
video, audio and text