Appreciate your help. I have an issue with the setValues in handleChange function, after the first onChange Event happens the form seems to reloaded and can't do more changes to the field. All I've been trying to do is to create a reusable form fields.
I have created a file BuildForm.js which has a custom hook that return the fields.
import { useState } from 'react';
const BuildForm = () => {
const [values, setValues] = useState({});
const [errors, setErrors] = useState({});
const validate = (name, value) => {
switch (name) {
case 'first_name':
if(value.trim() === ''){
errors[name] = 'First Name is Rrequired.';
setErrors(errors);
}
else{
errors[name] = '';
setErrors(errors);
}
break;
case 'last_name':
if(value.trim() === ''){ setErrors({...errors, [name]:'Last Name is Rrequired.'}); }
else{
setErrors({...errors, [name]:''});
}
break;
default:
break;
}
};
const handleChange = (event) => {
// event.persist();
let name = event.target.name;
let value = event.target.value;
validate(name, value);
setValues({...values, [name]:value}); // this is line with the issue
console.log(name, value);
};
const Name = (props) => {
return(
<div className="fullwidth">
<p className="description"><strong>{props.label}</strong></p>
<div className="firstname halfwidth left">
<label htmlFor="first_name">FIRST</label>
<input type="text" name="first_name" onChange={handleChange}/>
{ errors.first_name && <p className="validation">{errors.first_name}</p> }
</div>
<div className="lastname halfwidth right">
<label htmlFor="last_name">LAST</label>
<input type="text" name="last_name" onChange={handleChange} />
{ errors.last_name && <p className="validation">{errors.last_name}</p> }
</div>
</div>
);
};
return {
Name,
}
};
export default BuildForm;
and in the other file FirstForm.js where my form goes, i have this code
import './App.css';
import React, {useState} from 'react';
import { Link, Routes, Route, useNavigate } from 'react-router-dom';
import BuildForm from './Hooks/BuildForm';
function FirstForm() {
const navigate = useNavigate();
const MyForm = BuildForm();
return (
<div className="App">
<div id="header">
<img src={logo} className="logo" alt="logo"/>
</div>
<div id="pagebody">
<div id="formcontainer">
<form id="myForm">
<MyForm.Name label="Client Name"/>
<div className="submitbutton fullwidth"><input type="submit" /></div>
</form>
</div>
</div>
</div>
);
}
export default FirstForm;