
Form işlemlerinin karmaşıklığını daha kolay anlaşılır hale getirmek için var olan formik
kütüphanesini ve validation
yönetim aracı olan yup
nasıl uygulanır ele alacağım.
Bu yazımda
next.js
,tailwindcss
vetypescript
kullanılarak çok karmaşık olmadan anlatılmıştır.
Html input elementi için kullanılan bazı proplar ve kullanma amacı
type:
Input elementinin türünü belirtir.name:
Input nesnesini tanımlayan özelliktir.onChange:
Input değişim değerlerini verir.onBlur:
Input nesnesi ile kullanıcı arasındaki etkileşimi takip eder.
Formik için bilinmesi gereken fonksiyonlar
useFormik():
Form kendisine tanımlanan bütün olaylarını takip eder.initialValues:
Forminput
elemenlerinin başlangıç değerlerini barındırır veObject
içerisine girilen keylerin forminput
propsname
ile aynı olmalıdır.handlesubmit:
Formsubmit
olduğunda yapılacak işlemleri işlerhandleChange:
input
elementindeki değişimleri yakalar.values:
Form içerisinde inputlar girilen değerleri tutar.errors:
Form içerisinde oluşabilecekvalidation
hataları yakalar.handblur
Tanımlandığıinput
daha öncefocus
olundumu olunmadı mı durumlarını tutar.touched:
Kullanılması içinhandblur
fonksiyonununinput
a props olarak tanımlanması gerekir etkileşim oldu mu olmadı mı değerlerini tutar.onSubmit:
Formsubmit
olunca çalışaçak içerikleri belirler.validationSchema:
Formik
Input değerlerini tutar aynı zamanda dayup
kütüphanesi ile entegre çalışarakname
lerformik
de tanımlananname
ler ile aynı olmalıdır ve ikisi arasındaki değişimi takip ederek sonucu döner.
Example.tsx
"use client";
import { useFormik } from "formik";
import React from "react";
import { signUpSchema as validationSchema } from "@/components/utils/page";
function page() {
const { handleChange, values, handleSubmit, errors, touched, handleBlur } =
useFormik({
initialValues: {
email: "",
password: "",
passwordConfirm: "",
},
onSubmit: (values) => {
console.log(values);
},
validationSchema,
});
return (
<div className="flex justify-center items-center h-screen">
<form className="flex flex-col" onSubmit={handleSubmit}>
<label htmlFor="email" className="pt-2" onChange={handleChange}>
İsim
</label>
<input
type="text"
name="email"
className={`${errors.email &&touched.email&& "border-red-600"} border-2 rounded-md`}
onChange={handleChange}
onBlur={handleBlur}
/>
{errors.email &&touched.email&& <div>{errors.email}</div>}
<label htmlFor="password" className="pt-2">
Parola
</label>
<input
type="text"
name="password"
className="border-2 rounded-md"
onChange={handleChange}
onBlur={handleBlur}
/>
{errors.password &&touched.password&& <div>{errors.password}</div>}
<label htmlFor="passwordConfirm" className="pt-2">
Parola Tekrar
</label>
<input
type="text"
name="passwordConfirm"
className={`${errors.email &&touched.passwordConfirm&& "border-red-600"} border-2 rounded-md`}
onChange={handleChange}
onBlur={handleBlur}
/>
{errors.passwordConfirm &&touched.passwordConfirm&& <div>{errors.passwordConfirm}</div>}
<button className="border-2 p-2 rounded-lg mt-2" type="submit">
Gönder
</button>
</form>
</div>
);
}
export default page;
Yup için bilinmesi gereken fonksiyonlar
string():
Input içerisine girilen değerlerinstring
türünde olacağını belirtir.boolean
,number
da tanımlanabilir.required:
Inputun boş bırakılamayağını belirtir.email:
Girilen değerleremail
ad kurallarına uymalıdır.oneOf:
Input değerleri olanpassword
vepasswordConfirm
içeriklerinin karşılaştırlmasını sağlar. Diğer inpularda aynı şekilde karşılaştırılabilir.
validation.ts
import * as yup from "yup";
export const signUpSchema = yup.object({
email: yup
.string()
.required("Email is a required field")
.email("Email must be a valid email")
.nullable(),
password: yup.string().required("Password is a required field").min(8,"8 characters").nullable(),
passwordConfirm: yup
.string()
.oneOf([yup.ref("password")], "Passwordn't confirm")
.required("Confirm Password is a required field"),
});
