If you've worked on any react applications React Hook played a big role to Control Html elements and its properties.
Hook Which played a big role for developing React Application are useState(),useEffect(),useRef() and More .
In This post i will work on useState() Hook to Save input Data and useRef() for Form Validation.
Now we Come on Our Topic.
How to Create a Form in React? it is Design Part only
<>
<div className='FormValBody'>
<div className='FormValInputLabelSp'><div className='labelSeprater'><label >Name<span className='FormErrorLabelSp'>*</span></label></div>
<input ref={(element) => formValidateRef.current[0] = element} type='text' name='Name' value={Name} onChange={(e) => { onInputChange(e) }} />
</div>
<div className='FormValInputLabelSp'><div className='labelSeprater'><label >Mobile No<span className='FormErrorLabelSp'>*</span></label></div>
<input ref={(element) => formValidateRef.current[1] = element} type='text' name='MobileNo' value={MobileNo} onChange={(e) => { onInputChange(e) }} /></div>
<div className='FormValInputLabelSp'><div className='labelSeprater'><label >Email Address<span className='FormErrorLabelSp'></span></label></div>
<input type='text' name='EmailAddress' value={EmailAddress} onChange={(e) => { onInputChange(e) }} /></div>
<div className='FormValInputLabelSp'><div className='labelSeprater'><label >Gender<span className='FormErrorLabelSp'>*</span></label></div>
<label> Male </label>
<input ref={(element) => formValidateRef.current[2] = element} type='radio' name='Gender' value='Male' onChange={(e) => { onInputChange(e) }} />
<label> Female </label>
<input ref={(element) => formValidateRef.current[3] = element} name='Gender' type='radio' value='Female' onChange={(e) => { onInputChange(e) }} /></div>
<div className='FormValInputLabelSp'>
<div className='labelSeprater'>
<label >Date of Birth<span className='FormErrorLabelSp'>*</span></label>
</div>
<input ref={(element) => formValidateRef.current[4] = element} type='date' name='DateOfBirth' value={DateOfBirth} onChange={(e) => { onInputChange(e) }} />
</div>
<div className='FormValInputLabelSp'><div className='labelSeprater'><label >Language<span className='FormErrorLabelSp'>*</span></label></div>
<label>Hindi</label>
<input ref={(element) => formValidateRef.current[5] = element} type='checkBox' name='Language' value='Hindi' onChange={(e) => { onInputChange(e) }} />
<label>Marathi</label>
<input ref={(element) => formValidateRef.current[6] = element} name='Language' type='checkBox' value='Marathi' onChange={(e) => { onInputChange(e) }} />
<label>English</label>
<input ref={(element) => formValidateRef.current[7] = element} name='Language' type='checkBox' value='English' onChange={(e) => { onInputChange(e) }} />
</div>
<div className='FormValInputLabelSp'><div className='labelSeprater'><label >Country<span className='FormErrorLabelSp'>*</span></label></div>
<label>India</label>
<input ref={(element) => formValidateRef.current[8] = element} type='checkBox' name='Country' value='India' onChange={(e) => { onInputChange(e) }} />
<label>Nepal</label>
<input ref={(element) => formValidateRef.current[9] = element} name='Country' type='checkBox' value='Nepal' onChange={(e) => { onInputChange(e) }} />
</div>
<div className='FormValInputLabelSp'><div className='labelSeprater'><label >State<span className='FormErrorLabelSp'>*</span></label></div>
<select ref={(element) => formValidateRef.current[10] = element} name='State' value={State} onChange={(e) => { onInputChange(e) }}>
<option value=''>---Select---</option>
{StateName.map((sName, index) => (
<option key={index + sName} value={sName}>{sName}</option>
))}
</select></div>
<button className='btnAdd' onClick={AddBtnFnt}>Add</button>
</div>
</>
Now We Create App.css file for Styling Our Form.
App.css
/*form Validation */
.FormValBody {
float: left;
padding: 10px 10px 10px 10px;
background-color: azure;
}
.FormValBody input {
padding: 5px 5px 5px 5px;
border-color: gainsboro;
outline-color: darkgrey;
font-family: 'Times New Roman';
font-size: 18px;
}
.FormValBody input:active{
outline-color:blue;
}
.FormValInputLabelSp {
width: 393px;
margin-top: 7px;
}
.labelSeprater {
width: 133px;
display: inline-block;
}
.FormErrorLabelSp {
font-family: 'Comic Sans MS';
font-size: 12px;
color: red;
}
.btnAdd {
margin-top:25px;
margin-bottom:15px;
margin-left: 38%;
border: none;
padding: 10px 20px 10px 20px;
background-color: ButtonFace;
}
.btnAdd:hover{
cursor:pointer;
}
For Form Validation And Getting input Fields Value ,First We create Model related to our form.
Model For Form
Model Object
const DetailsModel = {
Name: '',
MobileNo: '',
EmailAddress: '',
Gender: '',
DateOfBirth: '',
Language: [],
State: '',
Country:''
}
Create Array of List For Our Drop-Down List.
const StateName = ['Assam', 'Bihar', 'Chhattisgarh', 'Jharkhand', 'Karnataka', 'Maharashtra', 'Uttar Pradesh'];
Next We use useState() Hook For Storing Input Data and useRef() HooK for Validate Our Form
const [details, setDetails] = useState(DetailsModel);
const formValidateRef = useRef([]);
For Easily Access Value Of Our Object Model Key Value, we destructure our Model Object
Deestructuring Object
/* Deestructuring Object*/
const { Name, MobileNo, EmailAddress, Gender, DateOfBirth, Language, State } = details;
Now We Create a Arrow Function For Update Out Input Field Value State.
onInputChange() function
const onInputChange = (e) => {
const { name, value } = e.target;
if (e.target.type === 'checkbox') {
if (e.target.checked) {
setDetails((previous) => ({ ...previous, [name]: [...eval(name), value] }));
}
else {
const filterData = eval(name).filter((lang) => { return lang !== value });
setDetails((previous) => ({ ...previous, [name]: filterData }));
}
}
else {
setDetails((previous) => ({ ...previous, [name]: value }))
}
}
After Storing This all Form Input fields data in state ,Now Time To validate Form. So We Create New Arrow Function for Validation.
ValidateData() function
const ValidateData = () => {
const validateArray = [];
const checkedList= [];
const unCheckedList= [];
for (let i = 0; i < formValidateRef.current.length; i++) {
if (!formValidateRef.current[i].value) {
validateArray.push({ ErrorMsg: formValidateRef.current[i].name + ' is required' });
}
else if (formValidateRef.current[i].value) {
if (formValidateRef.current[i].type === 'checkbox' || formValidateRef.current[i].type === 'radio') {
if (formValidateRef.current[i].checked) {
checkedList.push({ ErrorMsg: formValidateRef.current[i].name, IsStatus: formValidateRef.current[i].checked });
}
else {
unCheckedList.push({ ErrorMsg: formValidateRef.current[i].name, IsStatus: formValidateRef.current[i].checked });
}
}
}
}
const checkedDt = [...new Map(checkedList.map((obj) => [obj.ErrorMsg, obj])).values()];
const unCheckedDt = [...new Map(unCheckedList.map((obj) => [obj.ErrorMsg, obj])).values()];
const results = unCheckedDt.filter(({ ErrorMsg: unErrorMsg }) => !checkedDt.some(({ ErrorMsg: ckErrorMsg }) => ckErrorMsg === unErrorMsg));
if (checkedDt.length === 0 && unCheckedDt.length > 0) {
unCheckedDt.map((data) => {
validateArray.push({ ErrorMsg: data.ErrorMsg + ' is required' });
})
}
else if (checkedDt.length > 0 && unCheckedDt.length > 0) {
results.map((data) => {
validateArray.push({ ErrorMsg: data.ErrorMsg + ' is required' });
})
}
return validateArray;
}
So Finally We Call This Validation Function On Add Button and And after Validation Of Form ,we Show Data in alert() .
AddBtnFnt()
const AddBtnFnt = () => {
const isValied = ValidateData();
if (isValied.length > 0) {
alert(JSON.stringify(isValied))
}
else {
alert('SuccessFully Added')
}
}
Now Finally We Validate Our Form. Final All Code are Below
App.js
import React, { useState } from 'react';
import './App.css';
import React, { useRef, useState } from 'react';
const StateName = ['Assam', 'Bihar', 'Chhattisgarh', 'Jharkhand', 'Karnataka', 'Maharashtra', 'Uttar Pradesh'];
const DetailsModel = {
Name: '',
MobileNo: '',
EmailAddress: '',
Gender: '',
DateOfBirth: '',
Language: [],
State: '',
Country:''
}
const App = () => {
const [details, setDetails] = useState(DetailsModel);
const formValidateRef = useRef([]);
/* Deestructuring Object*/
const { Name, MobileNo, EmailAddress, Gender, DateOfBirth, Language, State, Country } = details;
const onInputChange = (e) => {
const { name, value } = e.target;
if (e.target.type === 'checkbox') {
if (e.target.checked) {
setDetails((previous) => ({ ...previous, [name]: [...eval(name), value] }));
}
else {
const filterData = eval(name).filter((lang) => { return lang !== value });
setDetails((previous) => ({ ...previous, [name]: filterData }));
}
}
else {
setDetails((previous) => ({ ...previous, [name]: value }))
}
}
const ValidateData = () => {
const validateArray = [];
const checkedList= [];
const unCheckedList= [];
for (let i = 0; i < formValidateRef.current.length; i++) {
if (!formValidateRef.current[i].value) {
validateArray.push({ ErrorMsg: formValidateRef.current[i].name + ' is required' });
}
else if (formValidateRef.current[i].value) {
if (formValidateRef.current[i].type === 'checkbox' || formValidateRef.current[i].type === 'radio') {
if (formValidateRef.current[i].checked) {
checkedList.push({ ErrorMsg: formValidateRef.current[i].name, IsStatus: formValidateRef.current[i].checked });
}
else {
unCheckedList.push({ ErrorMsg: formValidateRef.current[i].name, IsStatus: formValidateRef.current[i].checked });
}
}
}
}
const checkedDt = [...new Map(checkedList.map((obj) => [obj.ErrorMsg, obj])).values()];
const unCheckedDt = [...new Map(unCheckedList.map((obj) => [obj.ErrorMsg, obj])).values()];
const results = unCheckedDt.filter(({ ErrorMsg: unErrorMsg }) => !checkedDt.some(({ ErrorMsg: ckErrorMsg }) => ckErrorMsg === unErrorMsg));
if (checkedDt.length === 0 && unCheckedDt.length > 0) {
unCheckedDt.map((data) => {
validateArray.push({ ErrorMsg: data.ErrorMsg + ' is required' });
})
}
else if (checkedDt.length > 0 && unCheckedDt.length > 0) {
results.map((data) => {
validateArray.push({ ErrorMsg: data.ErrorMsg + ' is required' });
})
}
return validateArray;
}
const AddBtnFnt = () => {
const isValied = ValidateData();
if (isValied.length > 0) {
alert(JSON.stringify(isValied))
}
else {
alert('SuccessFully Added')
}
}
return (
<>
<div className='FormValBody'>
<div className='FormValInputLabelSp'><div className='labelSeprater'><label >Name<span className='FormErrorLabelSp'>*</span></label></div>
<input ref={(element) => formValidateRef.current[0] = element} type='text' name='Name' value={Name} onChange={(e) => { onInputChange(e) }} />
</div>
<div className='FormValInputLabelSp'><div className='labelSeprater'><label >Mobile No<span className='FormErrorLabelSp'>*</span></label></div>
<input ref={(element) => formValidateRef.current[1] = element} type='text' name='MobileNo' value={MobileNo} onChange={(e) => { onInputChange(e) }} /></div>
<div className='FormValInputLabelSp'><div className='labelSeprater'><label >Email Address<span className='FormErrorLabelSp'></span></label></div>
<input type='text' name='EmailAddress' value={EmailAddress} onChange={(e) => { onInputChange(e) }} /></div>
<div className='FormValInputLabelSp'><div className='labelSeprater'><label >Gender<span className='FormErrorLabelSp'>*</span></label></div>
<label> Male </label>
<input ref={(element) => formValidateRef.current[2] = element} type='radio' name='Gender' value='Male' onChange={(e) => { onInputChange(e) }} />
<label> Female </label>
<input ref={(element) => formValidateRef.current[3] = element} name='Gender' type='radio' value='Female' onChange={(e) => { onInputChange(e) }} /></div>
<div className='FormValInputLabelSp'>
<div className='labelSeprater'>
<label >Date of Birth<span className='FormErrorLabelSp'>*</span></label>
</div>
<input ref={(element) => formValidateRef.current[4] = element} type='date' name='DateOfBirth' value={DateOfBirth} onChange={(e) => { onInputChange(e) }} />
</div>
<div className='FormValInputLabelSp'><div className='labelSeprater'><label >Language<span className='FormErrorLabelSp'>*</span></label></div>
<label>Hindi</label>
<input ref={(element) => formValidateRef.current[5] = element} type='checkBox' name='Language' value='Hindi' onChange={(e) => { onInputChange(e) }} />
<label>Marathi</label>
<input ref={(element) => formValidateRef.current[6] = element} name='Language' type='checkBox' value='Marathi' onChange={(e) => { onInputChange(e) }} />
<label>English</label>
<input ref={(element) => formValidateRef.current[7] = element} name='Language' type='checkBox' value='English' onChange={(e) => { onInputChange(e) }} />
</div>
<div className='FormValInputLabelSp'><div className='labelSeprater'><label >Country<span className='FormErrorLabelSp'>*</span></label></div>
<label>India</label>
<input ref={(element) => formValidateRef.current[8] = element} type='checkBox' name='Country' value='India' onChange={(e) => { onInputChange(e) }} />
<label>Nepal</label>
<input ref={(element) => formValidateRef.current[9] = element} name='Country' type='checkBox' value='Nepal' onChange={(e) => { onInputChange(e) }} />
</div>
<div className='FormValInputLabelSp'><div className='labelSeprater'><label >State<span className='FormErrorLabelSp'>*</span></label></div>
<select ref={(element) => formValidateRef.current[10] = element} name='State' value={State} onChange={(e) => { onInputChange(e) }}>
<option value=''>---Select---</option>
{StateName.map((sName, index) => (
<option key={index + sName} value={sName}>{sName}</option>
))}
</select></div>
<button className='btnAdd' onClick={AddBtnFnt}>Add</button>
</div>
</>)
};
export default App;
Well done! Finally Validate Our For And Make A Awesome GUI ! Drop some love by liking or commenting ♥
Reference w3schools
Top comments (0)