'how to throw error in form validation using react
In my application i created signin form with two feilds username and password.using yup library i created Validation.js file and created adminValidation - written the yup validating code in it and imported in signin page ,in that by using onsubmit i get the formData (username and password) in console using this isValid "const isValid=await adminValidation.isValid(formData);" i get boolen value but i need to get error message under the textfeild. Here my code,
Validation.js
import * as yup from "yup";
export const adminValidation=yup.object().shape({
username:yup.string().required(),
password:yup.string().min(5).max(8).required()
})
SignIn.js
import { adminValidation } from '../components/Validation';
export default function SignIn() {
const handleSubmit = async (event) => {
event.preventDefault();
let formData = {
username:event.target[0].value,
password:event.target[2].value
}
console.log(formData);
const isValid=await adminValidation.isValid(formData);
console.log(isValid);
};
return (
<ThemeProvider theme={theme}>
<Container component="main" maxWidth="xs" style=
{{backgroundColor:'#e7e7e7',paddingBottom:'60px',boxShadow:"rgb(171 166 166) 0px 0px
10px 5px"}}>
<CssBaseline />
<Box
sx={{
marginTop: 8,
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
}}
>
<Avatar sx={{ m: 1, bgcolor: 'secondary.main' }}>
<LockOutlinedIcon />
</Avatar>
<Typography component="h1" variant="h5">
Sign in
</Typography>
<Box component="form" onSubmit={handleSubmit} noValidate sx={{ mt: 1 }}>
<TextField
margin="normal"
required
fullWidth
id="username"
label="Username"
name="username"
autoComplete="username"
autoFocus
/>
<TextField
margin="normal"
required
fullWidth
name="password"
label="Password"
type="password"
id="password"
autoComplete="current-password"
/>
<FormControlLabel
control={<Checkbox value="remember" color="primary" />}
label="Remember me"
/>
<Button
type="submit"
fullWidth
variant="contained"
sx={{ mt: 3, mb: 2 }}
>
Sign In
</Button>
{/* <Grid container>
<Grid item>
<Link to="/register">
Don't have an account? Sign Up
</Link>
</Grid>
</Grid> */}
</Box>
</Box>
</Container>
</ThemeProvider>
);
}
Solution 1:[1]
What if you do something like this:
username:yup.string()
password: yup.string()
.min(5, 'Password must be a min of 5 character')
.max(8, 'Password must be a min of 8 or more characters')
.required('Password field is required')
This is how to write a validation using Formik and Yup:
import Link from "next/link";
import React, { useState, useContext } from "react";
import { AiOutlineCar } from "react-icons/ai";
import { BsEye, BsEyeSlash } from "react-icons/bs";
import { useRouter } from "next/router";
import { usePostLoginMutation } from "@/store/ReduxStore/fetcherApi";
import { useFormik } from "formik";
import * as Yup from "yup";
function Login() {
const [showPassword, setShowPassword] = useState("password");
const [postLogin] = usePostLoginMutation();
const router = useRouter();
const formik = useFormik({
initialValues: {
email: "",
password: "",
},
validationSchema: Yup.object({
email: Yup.string()
.max(35, "Must be a max of 15 characters")
.min(4, "Must be a min of 4 characters")
.required("Email is required")
.email("Pls enter a valid email"),
password: Yup.string()
.max(20, "Must be a max of 15 characters")
.min(6, "Must be a min of 4 characters")
.required("Password is required"),
}),
onSubmit: async (values) => {
await postLogin(formik.values);
router.push("/profile");
},
});
const showPasswordHandler = () => {
if (showPassword === "password") {
setShowPassword("text");
} else {
setShowPassword("password");
}
};
return (
<div >
<div >
<div >
<p
aria-label="Login to your account"
>
Login to your account
</p>
<form onSubmit={formik.handleSubmit}>
<div className="mt-5">
<label >
Email
</label>
<input
id="email"
placeholder="Enter your email adress"
type="email"
className="authform"
onBlur={formik.handleBlur}
onChange={formik.handleChange}
value={formik.values.email}
/>
{formik.errors.email && formik.touched.email && (
<p>{formik.errors.email}</p>
)}
</div>
<div >
<label >
Password
</label>
<div className="showpasswordicon">
<input
id="password"
placeholder="Enter your password"
type={showPassword}
className="authform"
onBlur={formik.handleBlur}
onChange={formik.handleChange}
value={formik.values.password}
/>
<button
type="button"
onClick={showPasswordHandler}
"
>
{showPassword === "password" && <BsEye />}
{showPassword === "text" && <BsEyeSlash />}
</button>
</div>
{formik.errors.password && formik.touched.password && (
<p className="formerror">{formik.errors.password}</p>
)}
</div>
<div className="mt-8">
<button>Login</button>
</div>
</form>
<p>
Dont have account?{" "}
<span
>
<Link href="/signup">Sign up here</Link>
</span>
</p>
</div>
</div>
</footer>
</div>
);
}
export default Login;
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
