React functional component in React Form validator component

30 Jan 202319 minutes to read

This article provides a step-by-step instructions on using the React functional Hooks in a simple HTML form with the FormValidator component.

The following is a list of React Hooks methods to utilize while performing form validation.

Hooks Description
useState The useState is a Hook that allows the state to be defined in the functional components. If the initial state is passed to this function, then it will return a state variable with a value and a function to update this state value.
useEffect The useEffect is a Hook that executes code after rendering and re-rendering the component.
useRef The useRef is a Hook function that allows the functional component to create a direct reference to the DOM element.
useReducer The useReducer is a Hook function that accepts a reducer function and an initial state as arguments. It returns a state value and another function to dispatch an action.

Create a React form with Syncfusion form components

To create a React application with Syncfusion components, refer to the Getting Started section. Once the application is set up, replace the components with React form and Syncfusion form components to create a simple form.

In the following example, a login form is created with Syncfusion components such as TextBox, DatePicker, and Button. This form is validated using the React FormValidator component.

  • TextBox - To get the user’s email and password
  • DatePicker - To get the user’s date of birth
import { useState, useEffect, useRef, useReducer } from 'react';
import * as React from "react";
import { ButtonComponent } from '@syncfusion/ej2-react-buttons';
import { FormValidator } from '@syncfusion/ej2-inputs';
import { TextBoxComponent } from '@syncfusion/ej2-react-inputs';
import { DatePickerComponent } from '@syncfusion/ej2-react-calendars';
let formObject;
function App() {
    const userNameRef = useRef(null);
    const [dateOfBirth, setDateOfBirth] = useState('');
    const initialState = { email: '', password: '' };
    const reducer = (state, action) => {
        switch (action.type) {
            case 'update':
                return { ...state, [action.field]: action.value };
            default:
                return initialState;
        }
    };
    const [state, dispatch] = useReducer(reducer, initialState);
    const dateChangeHandler = (event) => {
        setDateOfBirth(event.value);
    };
    const update = (field) => (event) => {
        //update action is dispatched to update the email and password state value
        dispatch({ type: 'update', field, value: event.value });
    };
    useEffect(() => {
        userNameRef.current.focusIn();
        const options = {
            // validation rules
            rules: {
                email: {
                    required: [true, '* Please enter your email'],
                },
                password: {
                    required: [true, '* Please enter your password'],
                },
                date: {
                    required: [true, '* Please enter your date of birth'],
                },
            },
        };
        // Initialize the form validator
        formObject = new FormValidator('#form1', options);
    }, []);
    const onSubmit = () => {
        formObject.validate();
        if (formObject.validate()) {
            formObject.element.reset();
        }
    };
    return (<div>
      <div className="control_wrapper" id="control_wrapper">
        <h3 className="form-title">User Login</h3>
        <div className="control_wrapper textbox-form">
          <form id="form1" method="post">
            <div className="form-group">
              <TextBoxComponent ref={userNameRef} type="email" name="email" value={state.email} change={update('email')} placeholder="Username" floatLabelType="Auto" data-msg-containerid="errroForEmail"/>
              <div id="errroForEmail"/>
            </div>
            <div className="form-group">
              <TextBoxComponent type="password" name="password" value={state.password} change={update('password')} placeholder="Password" floatLabelType="Auto" data-msg-containerid="errroForPassword"/>
              <div id="errroForPassword"/>
            </div>
            <div className="form-group">
              <DatePickerComponent name="date" value={dateOfBirth} change={dateChangeHandler} placeholder="Date of Birth" floatLabelType="Auto" data-msg-containerid="errroForDateOfBirth"/>
              <div id="errroForDateOfBirth"/>
            </div>
          </form>
          <div className="submitBtn">
            <ButtonComponent onClick={onSubmit}>Submit</ButtonComponent>
          </div>
        </div>
        <br />
        <br />
      </div>
    </div>);
}
export default App;
import { useState, useEffect, useRef, useReducer } from 'react';
import * as React from "react";
import { ButtonComponent } from '@syncfusion/ej2-react-buttons';
import { FormValidator } from '@syncfusion/ej2-inputs';
import { TextBoxComponent } from '@syncfusion/ej2-react-inputs';
import { DatePickerComponent } from '@syncfusion/ej2-react-calendars';

let formObject;
function App() {
  const userNameRef = useRef(null);
  const [dateOfBirth, setDateOfBirth] = useState('');
  const initialState = { email: '', password: '' };
  const reducer = (state, action) => {
    switch (action.type) {
      case 'update':
        return { ...state, [action.field]: action.value };

      default:
        return initialState;
    }
  };
  const [state, dispatch] = useReducer(reducer, initialState);

  const dateChangeHandler = (event) => {
    setDateOfBirth(event.value);
  };

  const update = (field) => (event) => {
    //update action is dispatched to update the email and password state value
    dispatch({ type: 'update', field, value: event.value });
  };

  useEffect(() => {
    userNameRef.current.focusIn();
    const options = {
      // validation rules
      rules: {
        email: {
          required: [true, '* Please enter your email'],
        },
        password: {
          required: [true, '* Please enter your password'],
        },
        date: {
          required: [true, '* Please enter your date of birth'],
        },
      },
    };
    // Initialize the form validator
    formObject = new FormValidator('#form1', options);
  }, []);

  const onSubmit = () => {
    formObject.validate();
    if (formObject.validate()) {
      (formObject as any).element.reset();
    }
  };

  return (
    <div>
      <div className="control_wrapper" id="control_wrapper">
        <h3 className="form-title">User Login</h3>
        <div className="control_wrapper textbox-form">
          <form id="form1" method="post">
            <div className="form-group">
              <TextBoxComponent
                ref={userNameRef}
                type="email"
                name="email"
                value={state.email}
                change={update('email')}
                placeholder="Username"
                floatLabelType="Auto"
                data-msg-containerid="errroForEmail"
              />
              <div id="errroForEmail" />
            </div>
            <div className="form-group">
              <TextBoxComponent
                type="password"
                name="password"
                value={state.password}
                change={update('password')}
                placeholder="Password"
                floatLabelType="Auto"
                data-msg-containerid="errroForPassword"
              />
              <div id="errroForPassword" />
            </div>
            <div className="form-group">
              <DatePickerComponent
                name="date"
                value={dateOfBirth}
                change={dateChangeHandler}
                placeholder="Date of Birth"
                floatLabelType="Auto"
                data-msg-containerid="errroForDateOfBirth"
              />
              <div id="errroForDateOfBirth" />
            </div>
          </form>
          <div className="submitBtn">
            <ButtonComponent onClick={onSubmit}>Submit</ButtonComponent>
          </div>
        </div>
        <br />
        <br />
      </div>
    </div>
  );
}
export default App;

Perform validation

For the input validation, specify rules for the email, password, and date of birth fields. The form validation will be initiated using the useEffect Hook.

    useEffect(() => {
        const options = {
            // add the rules for validation
            rules: {
                email: {
                    required: [true, '* Please enter your email'],
                },
                password: {
                    required: [true, '* Please enter your password'],
                },
                date: {
                    required: [true, '* Please enter your date of birth'],
                },
            }
        };
        // initialize the form validator
        this.formObject = new FormValidator('#form1', options);
    }, []);

Check out the validation rules section to learn more about the validation rules.

Here, the useState Hook is used to store the value of the date of birth field.

const [dateOfBirth, setDateOfBirth] = useState('');

The useReducer Hook is used to update the email and password state values.

    const initialState = { email: '', password: '' };

    const reducer = (state, action) => {
        switch (action.type) {
            case 'update':
                return { ...state, [action.field]: action.value };
            default:
                return initialState;
        }
    };

    const [state, dispatch] = useReducer(reducer, initialState);

Here, the useRef Hook is used to focus the username field at initial loading.

    const userNameRef = useRef(null);
    useEffect(() => {
        userNameRef.current.focusIn();
    }

Run the Application

Run the application in the browser using the following command.

npm run start