React JS

React JS from

Form is an important component for any application that for the interaction with the user. Lets say, forms are the only way for receiving feedback & suggestion, user inputs and other inputs from the user. Same goes for the React JS applications. React JS recommends using controlled components to implement forms. Form data is handled by a React component in controlled component. The alternative is uncontrolled components, where form data is handled by the DOM itself. So here we are going to create a working React JS form.

Project Setup

First we’ll setup our react js project with create-react-app.

create-react-app example-form-app
cd example-form-app

This will create our project folder ‘example-form-app‘ with all the essential files and folder structure and dependency packages that we need to build our app. The project folder layout will look something like this.

example-form-app/
  README.md
  node_modules/
  package.json
  .gitignore
  public/
    favicon.ico
    index.html
  src/
    App.css
    App.js
    App.test.js
    index.css
    index.js
    logo.svg

To run the app, run npm start command, which runs our app in development mode. Open http://localhost:3000 to view in browser.

npm start

React JS form building

Now lest start building our form. We will be creating a simple form to get user details that will include name, address, email, phone, gender and marital status.

For that, we fill first replace default content of App.js file inside src/ folder with the following content.

import React from 'react';
import './App.css';
import Form from "./components/Form";

function App() {
    return (
        <div className="App">
            <header>
                <h1>User Details</h1>
            </header>
            <section>
            </section>
        </div>
    );
}

export default App;

Now we will create the form component to build the form that user will fillup. For that, we create a new folder called components (or anything you like) inside the src/ folder. We will define all our components inside this directory.

cd src/
mkdir components

Now we’ll create form component with the fields we mentioned above.

import React, {Component} from 'react';

class Form extends Component {

    constructor(props) {
        super(props);
        this.state = {}
    }

render(){
return <div className="container">
                <form></form>
</div>
}
}
export default Form;

Now we’ll add the form fields.

<form>
                    <label>Name </label>
                    <input type={'text'}
                           name={'name'}/>

                    <br/>

                    <label>Email </label>
                    <input type={'text'}
                           name={'email'}/>

                    <br/>

                    <label>Phone </label>
                    <input type={'tel'}
                           name={'phone'}/>

                    <br/>

                    <label>Address</label>
                    <textarea name={'address'}/>

                    <br/>

                    <label>Gender </label>
                    <select name={'gender'}>
                        <option value={'M'}>Male</option>
                        <option value={'F'}>Female</option>
                        <option value={'O'}>Other</option>
                    </select>


                    <br/>

                    <label>Married</label>
                    <input type={'checkbox'}
                           name={'married'}/>

<br/>
<button>Submit</button>
</form>

Here we will using controlled component to implement form. React JS virtual DOM handles the form fields . We can implement controlled component as below.

Form handling

First we set a form state variable along with the form fields we have in our form. in the constructor section, we add

this.state = {
form:{
name:'',
email:'',
address:'',
pone:'',
married:false,
gander:''
}
}

Now to reflect the changes in the controller form component while filling up the form, we will set the value of the form fields form the form state we defined above. For this, we need a method to handle the change in the form and update it in the form state. We define that method as

handleOnchange = (e) => {
        let form = this.state.form
        if (e.target.type === 'checkbox')
            if (e.target.checked) {
                form[e.target.name] = true
            } else {
                form[e.target.name] = false
            }
        else
            form[e.target.name] = e.target.value
        this.setState({
            form
        })
    }

Now we will call above method whenever user makes any change in the form component. We will capture the change event and update the form state accordingly.

Input textbox
// onChange={e => this.handleOnchange(e)}
 <input type={'text'}
                           value={this.state.form.name}
                           onChange={e => this.handleOnchange(e)}
                           name={'name'}/>
Checkbox
<input type={'checkbox'}
       onChange={e => this.handleOnchange(e)}
       checked={this.state.form.married ? 'checked' : ''}
       name={'married'}/>
Select Box
<select name={'gender'}
                            defaultValue={this.state.form.gender}
                            onChange={e => this.handleOnchange(e)}>
                        <option value={'M'}>Male</option>
                        <option value={'F'}>Female</option>
                        <option value={'O'}>Other</option>
                    </select>

Now any changes user makes in the form component is saved in the state.

Finally we need to submit the form to the API to save the form input. To submit the form, we ill define a method that will be called on form submission and handle the further process like posting form input to the API. We will be posting the form state data rather than the form itself.

handleSubmit = (e) => {
        e.preventDefault()
        console.log(this.state.form)
// futher logic to post the form data to API
// postToAPI(this.state.form)
    }

And in form component,

<form onSubmit={this.handleSubmit}>
...
</form>

Thus, we just created a controlled component form that user can fill and submit. This is just the basic form submission process. We can add validation and other rules and logic as per the need.

The complete code repo is available in Github