Creating React User Forms#
Last Updated: October 2, 2023
My project source code is available here.
Overview#
User forms are critical in React for collecting user input. In this lab I’ve created a user input form for registering a new user.
Files#
App.js#
The React app is contained in the App component. The App component contains the form and the form validation logic.
Note
The user form is defined in React and includes the onSubmit
prop.
The onSubmit
prop is a function that is called when the form is submitted.
<form onSubmit={handleSubmit}>
The various input fields are defined in the form. Each input field has an onChange
prop.
The password input type also has an onBlur
prop.
<input
type={"password"}
placeholder="Password"
value={password.value}
onChange={handlePasswordChange}
onBlur={(e) => setPassword({...password, isTouched: true})}
/>
App.js
import "./App.css";
import {useState} from "react";
import {validateEmail} from "./utils";
const PasswordErrorMessage = () => {
return (
<p className="FieldError">Password should have at least 8 characters</p>
);
};
function App() {
const [firstName, setFirstName] = useState("");
const [lastName, setLastName] = useState("");
const [email, setEmail] = useState("");
const [password, setPassword] = useState({
value: "",
isTouched: false,
});
const [role, setRole] = useState("role");
const getIsPasswordValid = () => {
// Implement this function
return password.value.length >= 8 && password.isTouched;
};
const getisRoleValid = () => {
return role === "individual" || role === "business";
};
const getIsEmailValid = () => {
let validationResult = validateEmail(email);
if (validationResult !== null && validateEmail(email).length > 0) {
return true;
} else {
return false;
}
};
const getIsFirstNameValid = () => {
return firstName.length > 0;
};
const getIsFormValid = () => {
let valid =
getIsFirstNameValid() &&
getIsEmailValid() &&
getIsPasswordValid() &&
getisRoleValid();
console.log("getIsEmailValid():", getIsEmailValid());
console.log("getIsFirstNameValid():", getIsFirstNameValid());
console.log("getIsPasswordValid():", getIsPasswordValid());
console.log("getisRoleValid():", getisRoleValid());
console.log("form is valid:", valid);
return valid;
};
function handleEmailChange(e) {
let valid = validateEmail(e.target.value);
console.log("email valid:", valid);
setEmail(e.target.value);
}
function handlePasswordChange(e) {
setPassword({...password, value: e.target.value});
if (!getIsPasswordValid(e)) {
return PasswordErrorMessage();
}
}
const clearForm = () => {
// Implement this function
setPassword({value: "", isTouched: false});
setEmail("");
setLastName("");
setFirstName("");
setRole("Role");
console.log("role", role);
console.log("password", password.value);
};
const handleSubmit = (e) => {
e.preventDefault();
clearForm();
alert("Account created!");
};
let passwordWarning = getIsPasswordValid() ? "" : <PasswordErrorMessage/>;
// let passwordWarning = <PasswordErrorMessage />;
return (
<div className="App">
<form onSubmit={handleSubmit}>
<fieldset>
<h2>Sign Up</h2>
<div className="Field">
<label>
First name <sup>*</sup>
</label>
<input
placeholder="First name"
value={firstName}
onChange={(e) => setFirstName(e.target.value)}
/>
</div>
<div className="Field">
<label>Last name</label>
<input
placeholder="Last name"
value={lastName}
onChange={(e) => setLastName(e.target.value)}
/>
</div>
<div className="Field">
<label>
Email address <sup>*</sup>
</label>
<input
placeholder="Email address"
value={email}
onChange={handleEmailChange}
/>
</div>
<div className="Field">
<label>
Password <sup>*</sup>
</label>
<input
type={"password"}
placeholder="Password"
value={password.value}
onChange={handlePasswordChange}
onBlur={(e) => setPassword({...password, isTouched: true})}
/>
{passwordWarning}
</div>
<div className="Field">
<label>
Role <sup>*</sup>
</label>
<select onChange={(e) => setRole(e.target.value)} value={role}>
<option value="role">Role</option>
<option value="individual">Individual</option>
<option value="business">Business</option>
</select>
</div>
<button type="submit" disabled={!getIsFormValid()}>
Create account
</button>
</fieldset>
</form>
</div>
);
}
export default App;
index.js#
Note
In the index.js file I’ve used the createRoot
method to render the React app.
const root = ReactDOM.createRoot(document.getElementById("root"));
index.js
import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./components/App";
import reportWebVitals from "./reportWebVitals";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<React.StrictMode>
<App/>
</React.StrictMode>,
);