I'm trying to validate the input of name and age. Neither can be empty and age should be over 0. https://codesandbox.io/s/agitated-microservice-g5lys?file=/src/App.js
I tried with two ways.
Solution 1: Add a validation at error message. Problem: at initial loading before user input, the error message is already shown.
{!enteredName ? <span> error msg: Please enter your first name</span> : null}
Solution 2: Add a validation inside the onsubmit handler function. Problem: not sure how to append the error message .
if (enteredName.trim().length === 0 || enteredAge.trim().length === 0) {
return;
}
if (enteredAge < 0) {
return;
}
Additional question: If i fuse solution 2 validation to solution 1, it'd be too long. How to wrap it in a separate function and attach it to solution 1?
Here's the entire code including both attempts.
import { useState } from "react";
function App() {
const [enteredName, setEnteredName] = useState("");
const [enteredAge, setEnteredAge] = useState("");
const [submittedUsers, setSubmittedUsers] = useState([]);
const nameChangeHandler = (event) => {
setEnteredName(event.target.value);
};
const ageChangeHandler = (event) => {
setEnteredAge(event.target.value);
};
const submittedHandler = (event) => {
event.preventDefault();
// Solution 1
//validate if input is empty? validate age above 0?
if (enteredName.trim().length === 0 || enteredAge.trim().length === 0) {
return null;
}
if (enteredAge < 0) {
return null;
}
// lift up state
setSubmittedUsers([
...submittedUsers,
{
name: enteredName,
age: enteredAge,
id: Math.random().toString()
},
]);
console.log(submittedUsers);
setEnteredName("");
setEnteredAge("");
};
return (
<div className="App">
<header className="App-header">
<h3>
<ul>
<li>Display user input </li>
<li>Validate user input</li>
</ul>
</h3>
<form onSubmit={submittedHandler}>
<input
placeholder="your name"
value={enteredName}
type="text"
onChange={nameChangeHandler}
/>
<br />
{/* Solution 2 */}
{!enteredName ? <span>error msg: Please enter your first name</span> : null}
<br />
<br />
<input
placeholder="your age (number > 0)"
type="number"
value={enteredAge}
onChange={ageChangeHandler}
/>
<br />
{!enteredAge ? <span> error msg: Please enter a valid age</span> : null}
<br />
<button>Submit</button>
<h3>
User input:
<ul>
{submittedUsers.map((u) => (
<li key={u.id}>
{u.name} ({u.age} years old)
</li>
))}
</ul>
</h3>
</form>
</header>
</div>
);
}
export default App;
