{"id":37877,"date":"2026-01-17T17:40:59","date_gmt":"2026-01-17T14:40:59","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=37877"},"modified":"2026-01-17T17:40:59","modified_gmt":"2026-01-17T14:40:59","slug":"react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/","title":{"rendered":"React ve Formik ile Giri\u015f Formu Do\u011frulama: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>React ve Formik ile Giri\u015f Formu Do\u011frulama: Kapsaml\u0131 Bir Rehber<\/h2>\n<h3>Giri\u015f: Form Do\u011frulaman\u0131n \u00d6nemi ve Neden Formik?<\/h3>\n<p>Modern web uygulamalar\u0131nda kullan\u0131c\u0131 deneyimi ve veri b\u00fct\u00fcnl\u00fc\u011f\u00fc, ba\u015far\u0131l\u0131 bir uygulaman\u0131n temel ta\u015flar\u0131ndand\u0131r. Bu ba\u011flamda, formlar kullan\u0131c\u0131 etkile\u015fiminin merkezinde yer al\u0131r ve form do\u011frulama (validation) s\u00fcreci kritik bir rol oynar. Bir giri\u015f formu \u00f6rne\u011finde, kullan\u0131c\u0131lar\u0131n ge\u00e7erli e-posta adresleri ve g\u00fcvenli \u015fifreler girmesini sa\u011flamak hem g\u00fcvenlik hem de kullan\u0131c\u0131 memnuniyeti a\u00e7\u0131s\u0131ndan vazge\u00e7ilmezdir. Yanl\u0131\u015f veya eksik veri giri\u015fi, uygulaman\u0131n arka ucunda hatalara yol a\u00e7abilir, g\u00fcvenlik a\u00e7\u0131klar\u0131na zemin haz\u0131rlayabilir ve kullan\u0131c\u0131lar\u0131n sinirini bozarak uygulamay\u0131 terk etmelerine neden olabilir.<\/p>\n<p>Form do\u011frulama iki ana d\u00fczeyde ger\u00e7ekle\u015ftirilir: istemci taraf\u0131 (client-side) ve sunucu taraf\u0131 (server-side). \u0130stemci taraf\u0131 do\u011frulama, kullan\u0131c\u0131n\u0131n girdilerini sunucuya g\u00f6ndermeden \u00f6nce taray\u0131c\u0131da kontrol eder. Bu, an\u0131nda geri bildirim sa\u011flayarak kullan\u0131c\u0131 deneyimini iyile\u015ftirir ve gereksiz sunucu isteklerini azalt\u0131r. Ancak, istemci taraf\u0131 do\u011frulama tek ba\u015f\u0131na yeterli de\u011fildir, \u00e7\u00fcnk\u00fc k\u00f6t\u00fc niyetli kullan\u0131c\u0131lar taray\u0131c\u0131daki kontrolleri atlayabilir. Bu nedenle, sunucu taraf\u0131 do\u011frulama her zaman uygulanmal\u0131d\u0131r. Bu makale, istemci taraf\u0131 do\u011frulamaya odaklanacak ve React uygulamalar\u0131nda Formik ve Yup k\u00fct\u00fcphanelerini kullanarak sa\u011flam ve kullan\u0131c\u0131 dostu giri\u015f formu do\u011frulamas\u0131n\u0131 nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m g\u00f6sterecektir.<\/p>\n<p>React, bile\u015fen tabanl\u0131 yap\u0131s\u0131 sayesinde formlar\u0131 y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc bir temel sunar. Ancak, form durumu y\u00f6netimi, do\u011frulama mant\u0131\u011f\u0131 ve hata mesajlar\u0131n\u0131n g\u00f6sterilmesi gibi g\u00f6revler, \u00f6zellikle karma\u015f\u0131k formlarda, \u00e7ok say\u0131da tekrar eden (boilerplate) kod yazmay\u0131 gerektirebilir. \u0130\u015fte tam bu noktada Formik devreye girer. Formik, React&#8217;te form olu\u015fturmay\u0131 ve y\u00f6netmeyi basitle\u015ftiren pop\u00fcler bir k\u00fct\u00fcphanedir. Formik, formun state&#8217;ini y\u00f6netmek, do\u011frulama hatalar\u0131n\u0131 izlemek, g\u00f6nderim s\u00fcrecini ele almak ve input alanlar\u0131n\u0131 kontrol etmek gibi s\u0131k\u0131c\u0131 g\u00f6revleri sizin i\u00e7in \u00fcstlenir. Bu sayede geli\u015ftiriciler, formun i\u015f mant\u0131\u011f\u0131na ve kullan\u0131c\u0131 aray\u00fcz\u00fcne odaklanabilirler. Formik ile birlikte genellikle Yup ad\u0131 verilen bir \u015fema do\u011frulama k\u00fct\u00fcphanesi kullan\u0131l\u0131r. Yup, deklaratif ve g\u00fc\u00e7l\u00fc do\u011frulama kurallar\u0131 tan\u0131mlamay\u0131 m\u00fcmk\u00fcn k\u0131larak do\u011frulama mant\u0131\u011f\u0131n\u0131 \u00e7ok daha okunabilir ve y\u00f6netilebilir hale getirir.<\/p>\n<p>Bu makalede, \u00f6ncelikle temel bir React giri\u015f formunun Formik olmadan nas\u0131l olu\u015fturuldu\u011funu ve kar\u015f\u0131la\u015f\u0131lan zorluklar\u0131 ele alaca\u011f\u0131z. Ard\u0131ndan, Formik&#8217;in <code>useFormik<\/code> hook&#8217;u ile bu formu nas\u0131l basitle\u015ftirece\u011fimizi g\u00f6sterece\u011fiz. Son olarak, Yup k\u00fct\u00fcphanesini entegre ederek daha geli\u015fmi\u015f ve yap\u0131land\u0131r\u0131lm\u0131\u015f do\u011frulama kurallar\u0131n\u0131 nas\u0131l uygulayaca\u011f\u0131m\u0131z\u0131 ayr\u0131nt\u0131l\u0131 bir \u015fekilde inceleyece\u011fiz. Ayr\u0131ca, kullan\u0131c\u0131 deneyimini iyile\u015ftirecek ipu\u00e7lar\u0131 ve en iyi uygulamalar hakk\u0131nda da bilgi verece\u011fiz.<\/p>\n<h3>Formik&#8217;e Giri\u015f: Form Y\u00f6netimini Kolayla\u015ft\u0131rmak<\/h3>\n<p>Formik, React uygulamalar\u0131nda form y\u00f6netimiyle ilgili t\u00fcm zorluklar\u0131 \u00e7\u00f6zmek i\u00e7in tasarlanm\u0131\u015f kapsaml\u0131 bir \u00e7\u00f6z\u00fcmd\u00fcr. Temel olarak, Formik \u00fc\u00e7 ana sorunu ele al\u0131r:<\/p>\n<p>1.  <strong>Form De\u011ferlerini Alma ve G\u00fcncelleme:<\/strong> Form input&#8217;lar\u0131n\u0131n de\u011ferlerini state&#8217;te tutmak ve her de\u011fi\u015fiklikte bu state&#8217;i g\u00fcncellemek.<br \/>\n2.  <strong>Do\u011frulama ve Hata Mesajlar\u0131:<\/strong> Kullan\u0131c\u0131n\u0131n girdilerini belirli kurallara g\u00f6re do\u011frulamak ve hatalar\u0131 kullan\u0131c\u0131ya anla\u015f\u0131l\u0131r bir \u015fekilde g\u00f6stermek.<br \/>\n3.  <strong>Form G\u00f6nderimi:<\/strong> Do\u011frulama ba\u015far\u0131l\u0131 oldu\u011funda form verilerini i\u015flemek ve sunucuya g\u00f6ndermek.<\/p>\n<p>Formik, bu g\u00f6revleri otomatikle\u015ftirerek geli\u015ftiricilerin formlarla ilgili boilerplate kodu yazma y\u00fck\u00fcn\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<\/p>\n<h4>Formik&#8217;in Temel Bile\u015fenleri ve Hook&#8217;lar\u0131<\/h4>\n<p>Formik, formlar\u0131 y\u00f6netmek i\u00e7in iki ana yakla\u015f\u0131m sunar:<\/p>\n<p>*   <strong><code>useFormik<\/code> Hook:<\/strong> Fonksiyonel bile\u015fenlerde Formik&#8217;in t\u00fcm \u00f6zelliklerini kullanmak i\u00e7in tercih edilen modern yakla\u015f\u0131md\u0131r. Daha esnek ve do\u011frudan kontrol sa\u011flar.<br \/>\n*   <strong><code><Formik><\/code> Bile\u015feni:<\/strong> Render prop deseni kullanarak form ba\u011flam\u0131n\u0131 sa\u011flar. <code><Field><\/code>, <code><ErrorMessage><\/code> gibi yard\u0131mc\u0131 bile\u015fenlerle birlikte kullan\u0131l\u0131r.<\/p>\n<p>Bu makalede, genellikle daha modern ve esnek kabul edilen <code>useFormik<\/code> hook&#8217;una odaklanaca\u011f\u0131z.<\/p>\n<h4>Kurulum<\/h4>\n<p>Formik&#8217;i projenize eklemek i\u00e7in npm veya yarn kullanabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">npm install formik yup\n<h2>veya<\/h2>\nyarn add formik yup<\/code><\/pre>\n<p><code>formik<\/code> paketi Formik k\u00fct\u00fcphanesini i\u00e7erirken, <code>yup<\/code> paketi \u015fema tabanl\u0131 do\u011frulama i\u00e7in kullanaca\u011f\u0131m\u0131z yard\u0131mc\u0131 k\u00fct\u00fcphanedir.<\/p>\n<h3>Temel Bir Giri\u015f Formu Olu\u015fturma (Formik Olmadan)<\/h3>\n<p>Formik&#8217;in sa\u011flad\u0131\u011f\u0131 avantajlar\u0131 daha iyi anlamak i\u00e7in, \u00f6ncelikle Formik kullanmadan basit bir giri\u015f formunu nas\u0131l olu\u015fturaca\u011f\u0131m\u0131za bakal\u0131m. Bu yakla\u015f\u0131m, form y\u00f6netimiyle ilgili manuel olarak ele almam\u0131z gereken ad\u0131mlar\u0131 ve kar\u015f\u0131la\u015f\u0131lan zorluklar\u0131 g\u00f6zler \u00f6n\u00fcne serecektir.<\/p>\n<pre><code class=\"language-jsx\">import React, { useState } from 'react';\n\nconst BasicLoginForm = () => {\n  const [email, setEmail] = useState('');\n  const [password, setPassword] = useState('');\n  const [errors, setErrors] = useState({});\n  const [message, setMessage] = useState('');\n\n  const validateForm = () => {\n    const newErrors = {};\n    if (!email) {\n      newErrors.email = 'E-posta alan\u0131 bo\u015f b\u0131rak\u0131lamaz.';\n    } else if (!\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(email)) {\n      newErrors.email = 'Ge\u00e7erli bir e-posta adresi girin.';\n    }\n\n    if (!password) {\n      newErrors.password = '\u015eifre alan\u0131 bo\u015f b\u0131rak\u0131lamaz.';\n    } else if (password.length < 6) {\n      newErrors.password = '\u015eifre en az 6 karakter olmal\u0131d\u0131r.';\n    }\n\n    setErrors(newErrors);\n    return Object.keys(newErrors).length === 0;\n  };\n\n  const handleSubmit = (e) => {\n    e.preventDefault(); \/\/ Sayfan\u0131n yeniden y\u00fcklenmesini engelle\n    setMessage('');\n\n    if (validateForm()) {\n      \/\/ Do\u011frulama ba\u015far\u0131l\u0131, formu g\u00f6nderebiliriz\n      console.log('Form g\u00f6nderiliyor:', { email, password });\n      setMessage('Giri\u015f ba\u015far\u0131l\u0131!');\n      \/\/ Burada API \u00e7a\u011fr\u0131s\u0131 yap\u0131labilir\n    } else {\n      setMessage('L\u00fctfen formdaki hatalar\u0131 d\u00fczeltin.');\n    }\n  };\n\n  return (\n    <div style={{ maxWidth: '400px', margin: '50px auto', padding: '20px', border: '1px solid #ccc', borderRadius: '8px' }}>\n      <h3>Giri\u015f Yap (Formik Olmadan)<\/h3>\n      <form onSubmit={handleSubmit}>\n        <div style={{ marginBottom: '15px' }}>\n          <label htmlFor=\"email\" style={{ display: 'block', marginBottom: '5px' }}>E-posta:<\/label>\n          <input\n            type=\"email\"\n            id=\"email\"\n            name=\"email\"\n            value={email}\n            onChange={(e) => setEmail(e.target.value)}\n            style={{ width: '100%', padding: '8px', boxSizing: 'border-box', border: '1px solid #ddd', borderRadius: '4px' }}\n          \/>\n          {errors.email && <div style={{ color: 'red', fontSize: '0.9em', marginTop: '5px' }}>{errors.email}<\/div>}\n        <\/div>\n        <div style={{ marginBottom: '15px' }}>\n          <label htmlFor=\"password\" style={{ display: 'block', marginBottom: '5px' }}>\u015eifre:<\/label>\n          <input\n            type=\"password\"\n            id=\"password\"\n            name=\"password\"\n            value={password}\n            onChange={(e) => setPassword(e.target.value)}\n            style={{ width: '100%', padding: '8px', boxSizing: 'border-box', border: '1px solid #ddd', borderRadius: '4px' }}\n          \/>\n          {errors.password && <div style={{ color: 'red', fontSize: '0.9em', marginTop: '5px' }}>{errors.password}<\/div>}\n        <\/div>\n        <button\n          type=\"submit\"\n          style={{\n            width: '100%',\n            padding: '10px',\n            backgroundColor: '#007bff',\n            color: 'white',\n            border: 'none',\n            borderRadius: '4px',\n            cursor: 'pointer'\n          }}\n        >\n          Giri\u015f Yap\n        <\/button>\n        {message && <div style={{ marginTop: '15px', color: message.includes('ba\u015far\u0131l\u0131') ? 'green' : 'red' }}>{message}<\/div>}\n      <\/form>\n    <\/div>\n  );\n};\n\nexport default BasicLoginForm;<\/code><\/pre>\n<p>Bu \u00f6rnekte, her input alan\u0131 i\u00e7in ayr\u0131 bir <code>useState<\/code> hook&#8217;u tan\u0131mlad\u0131k (<code>email<\/code>, <code>password<\/code>). Ayr\u0131ca, do\u011frulama hatalar\u0131n\u0131 tutmak i\u00e7in <code>errors<\/code> state&#8217;ini ve genel mesajlar\u0131 g\u00f6stermek i\u00e7in <code>message<\/code> state&#8217;ini kulland\u0131k. <code>onChange<\/code> olay y\u00f6neticileri her input de\u011fi\u015fti\u011finde ilgili state&#8217;i g\u00fcnceller. <code>validateForm<\/code> fonksiyonu, temel do\u011frulama kurallar\u0131n\u0131 (bo\u015fluk kontrol\u00fc, e-posta format\u0131, \u015fifre uzunlu\u011fu) manuel olarak kontrol eder ve hata nesnesini g\u00fcnceller. <code>handleSubmit<\/code> fonksiyonu ise <code>preventDefault<\/code> \u00e7a\u011fr\u0131s\u0131 yaparak sayfan\u0131n yeniden y\u00fcklenmesini engeller, <code>validateForm<\/code>&#8216;u \u00e7a\u011f\u0131r\u0131r ve sonucuna g\u00f6re formu g\u00f6nderir veya hata mesajlar\u0131n\u0131 g\u00f6sterir.<\/p>\n<h4>Dezavantajlar\u0131<\/h4>\n<p>Bu yakla\u015f\u0131m\u0131n baz\u0131 dezavantajlar\u0131 vard\u0131r:<\/p>\n<p>*   <strong>Tekrarlayan Kod (Boilerplate):<\/strong> Her input i\u00e7in <code>useState<\/code>, <code>onChange<\/code> handler&#8217;\u0131 ve do\u011frulama mant\u0131\u011f\u0131 yazmak gerekiyor. Form b\u00fcy\u00fcd\u00fck\u00e7e bu durum daha da karma\u015f\u0131kla\u015f\u0131r.<br \/>\n*   <strong>State Y\u00f6netimi:<\/strong> Formun genel state&#8217;ini, input de\u011ferlerini, hatalar\u0131 ve dokunulmu\u015f (touched) durumlar\u0131 manuel olarak y\u00f6netmek karma\u015f\u0131kt\u0131r.<br \/>\n*   <strong>\u00d6l\u00e7eklenebilirlik:<\/strong> Yeni alanlar eklendi\u011finde veya do\u011frulama kurallar\u0131 de\u011fi\u015fti\u011finde, kodu g\u00fcncellemek ve test etmek zahmetli hale gelir.<br \/>\n*   <strong>Kullan\u0131c\u0131 Deneyimi:<\/strong> Hata mesajlar\u0131n\u0131n ne zaman g\u00f6sterilece\u011fi (\u00f6rne\u011fin, kullan\u0131c\u0131 alan\u0131 terk etti\u011finde mi yoksa formu g\u00f6ndermeye \u00e7al\u0131\u015ft\u0131\u011f\u0131nda m\u0131) gibi detaylar\u0131 manuel olarak y\u00f6netmek gerekir.<\/p>\n<p>Bu zorluklar, Formik gibi k\u00fct\u00fcphanelerin neden bu kadar de\u011ferli oldu\u011funu a\u00e7\u0131k\u00e7a ortaya koymaktad\u0131r. \u015eimdi, Formik kullanarak bu formu nas\u0131l daha verimli bir \u015fekilde olu\u015fturaca\u011f\u0131m\u0131za ge\u00e7elim.<\/p>\n<h3>Formik ile Giri\u015f Formu Olu\u015fturma<\/h3>\n<p>Formik, yukar\u0131da bahsedilen dezavantajlar\u0131 ortadan kald\u0131rarak form y\u00f6netimini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir. <code>useFormik<\/code> hook&#8217;u, fonksiyonel bile\u015fenlerde Formik&#8217;in t\u00fcm g\u00fcc\u00fcn\u00fc kullanmam\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-jsx\">import React from 'react';\nimport { useFormik } from 'formik';\n\nconst FormikLoginForm = () => {\n  \/\/ 1. useFormik hook'unu ba\u015flat\n  const formik = useFormik({\n    initialValues: {\n      email: '',\n      password: '',\n    },\n    validate: (values) => {\n      const errors = {};\n      if (!values.email) {\n        errors.email = 'E-posta alan\u0131 bo\u015f b\u0131rak\u0131lamaz.';\n      } else if (!\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(values.email)) {\n        errors.email = 'Ge\u00e7erli bir e-posta adresi girin.';\n      }\n\n      if (!values.password) {\n        errors.password = '\u015eifre alan\u0131 bo\u015f b\u0131rak\u0131lamaz.';\n      } else if (values.password.length < 6) {\n        errors.password = '\u015eifre en az 6 karakter olmal\u0131d\u0131r.';\n      }\n      return errors;\n    },\n    onSubmit: (values, { setSubmitting, resetForm }) => {\n      \/\/ Do\u011frulama ba\u015far\u0131l\u0131, formu g\u00f6nderebiliriz\n      console.log('Form g\u00f6nderiliyor:', values);\n      \/\/ setSubmitting(true); \/\/ G\u00f6nderim ba\u015flad\u0131\u011f\u0131nda butonu devre d\u0131\u015f\u0131 b\u0131rakmak i\u00e7in\n      \n      \/\/ API \u00e7a\u011fr\u0131s\u0131 sim\u00fclasyonu\n      setTimeout(() => {\n        alert(JSON.stringify(values, null, 2) + ' - Giri\u015f ba\u015far\u0131l\u0131!');\n        setSubmitting(false); \/\/ G\u00f6nderim tamamland\u0131\u011f\u0131nda butonu tekrar etkinle\u015ftir\n        resetForm(); \/\/ Formu s\u0131f\u0131rla\n      }, 1000);\n    },\n  });\n\n  return (\n    <div style={{ maxWidth: '400px', margin: '50px auto', padding: '20px', border: '1px solid #ccc', borderRadius: '8px' }}>\n      <h3>Giri\u015f Yap (Formik ile)<\/h3>\n      <form onSubmit={formik.handleSubmit}>\n        <div style={{ marginBottom: '15px' }}>\n          <label htmlFor=\"email\" style={{ display: 'block', marginBottom: '5px' }}>E-posta:<\/label>\n          <input\n            type=\"email\"\n            id=\"email\"\n            name=\"email\" \/\/ name \u00f6zelli\u011fi Formik i\u00e7in kritik\n            onChange={formik.handleChange}\n            onBlur={formik.handleBlur} \/\/ Alan\u0131 terk etti\u011finde do\u011frulamay\u0131 tetikler\n            value={formik.values.email}\n            style={{ width: '100%', padding: '8px', boxSizing: 'border-box', border: '1px solid #ddd', borderRadius: '4px' }}\n          \/>\n          {formik.touched.email && formik.errors.email && (\n            <div style={{ color: 'red', fontSize: '0.9em', marginTop: '5px' }}>{formik.errors.email}<\/div>\n          )}\n        <\/div>\n        <div style={{ marginBottom: '15px' }}>\n          <label htmlFor=\"password\" style={{ display: 'block', marginBottom: '5px' }}>\u015eifre:<\/label>\n          <input\n            type=\"password\"\n            id=\"password\"\n            name=\"password\" \/\/ name \u00f6zelli\u011fi Formik i\u00e7in kritik\n            onChange={formik.handleChange}\n            onBlur={formik.handleBlur} \/\/ Alan\u0131 terk etti\u011finde do\u011frulamay\u0131 tetikler\n            value={formik.values.password}\n            style={{ width: '100%', padding: '8px', boxSizing: 'border-box', border: '1px solid #ddd', borderRadius: '4px' }}\n          \/>\n          {formik.touched.password && formik.errors.password && (\n            <div style={{ color: 'red', fontSize: '0.9em', marginTop: '5px' }}>{formik.errors.password}<\/div>\n          )}\n        <\/div>\n        <button\n          type=\"submit\"\n          disabled={formik.isSubmitting} \/\/ G\u00f6nderim s\u0131ras\u0131nda butonu devre d\u0131\u015f\u0131 b\u0131rak\n          style={{\n            width: '100%',\n            padding: '10px',\n            backgroundColor: '#007bff',\n            color: 'white',\n            border: 'none',\n            borderRadius: '4px',\n            cursor: formik.isSubmitting ? 'not-allowed' : 'pointer',\n            opacity: formik.isSubmitting ? 0.7 : 1\n          }}\n        >\n          {formik.isSubmitting ? 'G\u00f6nderiliyor...' : 'Giri\u015f Yap'}\n        <\/button>\n      <\/form>\n    <\/div>\n  );\n};\n\nexport default FormikLoginForm;<\/code><\/pre>\n<h4><code>useFormik<\/code> Hook&#8217;unun A\u00e7\u0131klamas\u0131<\/h4>\n<p><code>useFormik<\/code> hook&#8217;u, bir konfig\u00fcrasyon nesnesi al\u0131r ve form durumunu ve yard\u0131mc\u0131 y\u00f6ntemleri i\u00e7eren bir <code>formik<\/code> nesnesi d\u00f6nd\u00fcr\u00fcr.<\/p>\n<p>*   <strong><code>initialValues<\/code><\/strong>: Formun ba\u015flang\u0131\u00e7 de\u011ferlerini tan\u0131mlayan bir nesnedir. Her input alan\u0131n\u0131n <code>name<\/code> \u00f6zelli\u011fi, <code>initialValues<\/code>&#8216;taki kar\u015f\u0131l\u0131k gelen anahtarla e\u015fle\u015fmelidir.<br \/>\n*   <strong><code>validate<\/code><\/strong>: Form de\u011ferleri de\u011fi\u015fti\u011finde veya <code>handleSubmit<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda Formik taraf\u0131ndan otomatik olarak \u00e7a\u011fr\u0131lan bir fonksiyon. <code>values<\/code> nesnesini arg\u00fcman olarak al\u0131r ve bir <code>errors<\/code> nesnesi d\u00f6nd\u00fcrmelidir. E\u011fer <code>errors<\/code> nesnesinde bir alan i\u00e7in hata varsa, o alan ge\u00e7ersiz kabul edilir.<br \/>\n*   <strong><code>onSubmit<\/code><\/strong>: Do\u011frulama ba\u015far\u0131l\u0131 oldu\u011funda ve form g\u00f6nderildi\u011finde \u00e7a\u011fr\u0131lan fonksiyondur. <code>values<\/code> nesnesini ve Formik&#8217;in baz\u0131 yard\u0131mc\u0131lar\u0131n\u0131 (\u00f6rne\u011fin <code>setSubmitting<\/code>, <code>resetForm<\/code>) arg\u00fcman olarak al\u0131r. Bu fonksiyonda genellikle sunucuya bir API \u00e7a\u011fr\u0131s\u0131 yap\u0131l\u0131r.<\/p>\n<h4><code>formik<\/code> Nesnesinin \u00d6zellikleri<\/h4>\n<p><code>useFormik<\/code> taraf\u0131ndan d\u00f6nd\u00fcr\u00fclen <code>formik<\/code> nesnesi, formla ilgili bir\u00e7ok faydal\u0131 \u00f6zellik ve y\u00f6ntem i\u00e7erir:<\/p>\n<p>*   <strong><code>formik.values<\/code><\/strong>: Formdaki t\u00fcm input alanlar\u0131n\u0131n g\u00fcncel de\u011ferlerini i\u00e7eren bir nesne.<br \/>\n*   <strong><code>formik.errors<\/code><\/strong>: Do\u011frulama hatalar\u0131n\u0131 i\u00e7eren bir nesne. Anahtarlar input <code>name<\/code>&#8216;lerine kar\u015f\u0131l\u0131k gelir, de\u011ferler ise hata mesajlar\u0131d\u0131r.<br \/>\n*   <strong><code>formik.touched<\/code><\/strong>: Hangi input alanlar\u0131na kullan\u0131c\u0131n\u0131n dokundu\u011funu (odaklan\u0131p sonra ayr\u0131ld\u0131\u011f\u0131n\u0131) belirten bir nesne. Bu, hata mesajlar\u0131n\u0131 yaln\u0131zca kullan\u0131c\u0131 bir alandan ayr\u0131ld\u0131ktan sonra g\u00f6stermek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<br \/>\n*   <strong><code>formik.handleChange<\/code><\/strong>: T\u00fcm input alanlar\u0131 i\u00e7in kullan\u0131labilen genel bir <code>onChange<\/code> olay y\u00f6neticisidir. Input&#8217;un <code>name<\/code> \u00f6zelli\u011fine g\u00f6re <code>formik.values<\/code>&#8216;u otomatik olarak g\u00fcnceller.<br \/>\n*   <strong><code>formik.handleBlur<\/code><\/strong>: T\u00fcm input alanlar\u0131 i\u00e7in kullan\u0131labilen genel bir <code>onBlur<\/code> olay y\u00f6neticisidir. Bir input&#8217;tan odaklanma ayr\u0131ld\u0131\u011f\u0131nda <code>formik.touched<\/code> nesnesini g\u00fcnceller.<br \/>\n*   <strong><code>formik.handleSubmit<\/code><\/strong>: Formun <code>onSubmit<\/code> olay y\u00f6neticisine atanmas\u0131 gereken fonksiyondur. Do\u011frulamay\u0131 tetikler ve do\u011frulama ba\u015far\u0131l\u0131 olursa <code>onSubmit<\/code> callback&#8217;ini \u00e7a\u011f\u0131r\u0131r.<br \/>\n*   <strong><code>formik.isSubmitting<\/code><\/strong>: Formun g\u00f6nderim s\u00fcrecinde olup olmad\u0131\u011f\u0131n\u0131 belirten bir boolean de\u011feridir. G\u00f6nderim s\u0131ras\u0131nda butonu devre d\u0131\u015f\u0131 b\u0131rakmak i\u00e7in kullan\u0131labilir.<\/p>\n<p>Bu yap\u0131 sayesinde, Formik formun state&#8217;ini, do\u011frulamas\u0131n\u0131 ve g\u00f6nderimini merkezi bir yerden y\u00f6neterek kodu \u00e7ok daha d\u00fczenli ve okunabilir hale getirir. \u00d6zellikle <code>handleChange<\/code> ve <code>handleBlur<\/code> gibi jenerik y\u00f6neticiler sayesinde her input i\u00e7in ayr\u0131 ayr\u0131 state ve event handler tan\u0131mlama ihtiyac\u0131 ortadan kalkar.<\/p>\n<h3>Schema Tabanl\u0131 Do\u011frulama (Yup ile)<\/h3>\n<p>Yukar\u0131daki <code>validate<\/code> fonksiyonu, temel senaryolar i\u00e7in yeterli olsa da, do\u011frulama kurallar\u0131 karma\u015f\u0131kla\u015ft\u0131k\u00e7a veya form b\u00fcy\u00fcd\u00fck\u00e7e bu fonksiyonun bak\u0131m\u0131 zorla\u015fabilir. D\u00fczenli ifadeler (regex) okunakl\u0131l\u0131\u011f\u0131 azaltabilir ve hata mesajlar\u0131n\u0131 y\u00f6netmek zorla\u015fabilir. \u0130\u015fte burada Yup gibi bir \u015fema do\u011frulama k\u00fct\u00fcphanesi devreye girer.<\/p>\n<p>Yup, JavaScript de\u011ferleri i\u00e7in \u015femalar tan\u0131mlamay\u0131 ve bu \u015femalara g\u00f6re do\u011frulama yapmay\u0131 sa\u011flayan bir k\u00fct\u00fcphanedir. Formik ile m\u00fckemmel bir uyum i\u00e7indedir ve do\u011frulama mant\u0131\u011f\u0131n\u0131 daha deklaratif, okunabilir ve yeniden kullan\u0131labilir hale getirir.<\/p>\n<h4>Yup Nedir ve Neden Kullanmal\u0131y\u0131z?<\/h4>\n<p>Yup, JSON Schema benzeri bir API ile \u00e7al\u0131\u015f\u0131r. Bir nesnenin veya dizinin yap\u0131s\u0131n\u0131 ve i\u00e7indeki her alan\u0131n veri tipini, zorunlulu\u011funu, format\u0131n\u0131 ve di\u011fer k\u0131s\u0131tlamalar\u0131n\u0131 tan\u0131mlaman\u0131za olanak tan\u0131r.<\/p>\n<p><strong>Avantajlar\u0131:<\/strong><\/p>\n<p>*   <strong>Deklaratif:<\/strong> Do\u011frulama kurallar\u0131n\u0131 a\u00e7\u0131k ve okunabilir bir \u015fekilde tan\u0131mlars\u0131n\u0131z.<br \/>\n*   <strong>G\u00fc\u00e7l\u00fc ve Esnek:<\/strong> Bir\u00e7ok yerle\u015fik do\u011frulama kural\u0131 (string, number, boolean, date, array, object vb.) ve \u00f6zel kurallar ekleme yetene\u011fi sunar.<br \/>\n*   <strong>Yeniden Kullan\u0131labilirlik:<\/strong> Ayn\u0131 do\u011frulama \u015femas\u0131n\u0131 uygulaman\u0131z\u0131n farkl\u0131 yerlerinde kullanabilirsiniz.<br \/>\n*   <strong>Hata Mesajlar\u0131:<\/strong> Her kural i\u00e7in \u00f6zel hata mesajlar\u0131 tan\u0131mlayabilirsiniz.<\/p>\n<h4>Yup Kurulumu<\/h4>\n<p>Daha \u00f6nce de belirtti\u011fimiz gibi, Yup&#8217;\u0131 projenize <code>npm install yup<\/code> veya <code>yarn add yup<\/code> komutuyla ekleyebilirsiniz.<\/p>\n<h4>Giri\u015f Formu i\u00e7in Yup \u015eemas\u0131 Olu\u015fturma ve Formik Entegrasyonu<\/h4>\n<p>\u015eimdi, \u00f6nceki Formik giri\u015f formumuzun <code>validate<\/code> fonksiyonunu Yup \u015fema tabanl\u0131 do\u011frulama ile de\u011fi\u015ftirelim.<\/p>\n<pre><code class=\"language-jsx\">import React from 'react';\nimport { useFormik } from 'formik';\nimport * as Yup from 'yup'; \/\/ Yup k\u00fct\u00fcphanesini i\u00e7e aktar\n\nconst FormikYupLoginForm = () => {\n  \/\/ Yup ile do\u011frulama \u015femas\u0131n\u0131 tan\u0131mla\n  const validationSchema = Yup.object().shape({\n    email: Yup.string()\n      .email('Ge\u00e7erli bir e-posta adresi girin.') \/\/ E-posta format\u0131 kontrol\u00fc\n      .required('E-posta alan\u0131 bo\u015f b\u0131rak\u0131lamaz.'), \/\/ Zorunluluk kontrol\u00fc\n    password: Yup.string()\n      .min(6, '\u015eifre en az 6 karakter olmal\u0131d\u0131r.') \/\/ Minimum uzunluk\n      .required('\u015eifre alan\u0131 bo\u015f b\u0131rak\u0131lamaz.'), \/\/ Zorunluluk kontrol\u00fc\n      \/\/ .matches(\/[a-z]\/, '\u015eifre en az bir k\u00fc\u00e7\u00fck harf i\u00e7ermelidir.') \/\/ Daha karma\u015f\u0131k kurallar eklenebilir\n      \/\/ .matches(\/[A-Z]\/, '\u015eifre en az bir b\u00fcy\u00fck harf i\u00e7ermelidir.')\n      \/\/ .matches(\/[0-9]\/, '\u015eifre en az bir rakam i\u00e7ermelidir.')\n      \/\/ .matches(\/[^a-zA-Z0-9]\/, '\u015eifre en az bir \u00f6zel karakter i\u00e7ermelidir.'),\n  });\n\n  const formik = useFormik({\n    initialValues: {\n      email: '',\n      password: '',\n    },\n    validationSchema: validationSchema, \/\/ Yup \u015femas\u0131n\u0131 Formik'e ata\n    onSubmit: (values, { setSubmitting, resetForm }) => {\n      console.log('Form g\u00f6nderiliyor:', values);\n      setTimeout(() => {\n        alert(JSON.stringify(values, null, 2) + ' - Giri\u015f ba\u015far\u0131l\u0131!');\n        setSubmitting(false);\n        resetForm();\n      }, 1000);\n    },\n  });\n\n  return (\n    <div style={{ maxWidth: '400px', margin: '50px auto', padding: '20px', border: '1px solid #ccc', borderRadius: '8px' }}>\n      <h3>Giri\u015f Yap (Formik ve Yup ile)<\/h3>\n      <form onSubmit={formik.handleSubmit}>\n        <div style={{ marginBottom: '15px' }}>\n          <label htmlFor=\"email\" style={{ display: 'block', marginBottom: '5px' }}>E-posta:<\/label>\n          <input\n            type=\"email\"\n            id=\"email\"\n            name=\"email\"\n            onChange={formik.handleChange}\n            onBlur={formik.handleBlur}\n            value={formik.values.email}\n            style={{ width: '100%', padding: '8px', boxSizing: 'border-box', border: '1px solid #ddd', borderRadius: '4px' }}\n          \/>\n          {formik.touched.email && formik.errors.email && (\n            <div style={{ color: 'red', fontSize: '0.9em', marginTop: '5px' }}>{formik.errors.email}<\/div>\n          )}\n        <\/div>\n        <div style={{ marginBottom: '15px' }}>\n          <label htmlFor=\"password\" style={{ display: 'block', marginBottom: '5px' }}>\u015eifre:<\/label>\n          <input\n            type=\"password\"\n            id=\"password\"\n            name=\"password\"\n            onChange={formik.handleChange}\n            onBlur={formik.handleBlur}\n            value={formik.values.password}\n            style={{ width: '100%', padding: '8px', boxSizing: 'border-box', border: '1px solid #ddd', borderRadius: '4px' }}\n          \/>\n          {formik.touched.password && formik.errors.password && (\n            <div style={{ color: 'red', fontSize: '0.9em', marginTop: '5px' }}>{formik.errors.password}<\/div>\n          )}\n        <\/div>\n        <button\n          type=\"submit\"\n          disabled={formik.isSubmitting}\n          style={{\n            width: '100%',\n            padding: '10px',\n            backgroundColor: '#007bff',\n            color: 'white',\n            border: 'none',\n            borderRadius: '4px',\n            cursor: formik.isSubmitting ? 'not-allowed' : 'pointer',\n            opacity: formik.isSubmitting ? 0.7 : 1\n          }}\n        >\n          {formik.isSubmitting ? 'G\u00f6nderiliyor...' : 'Giri\u015f Yap'}\n        <\/button>\n      <\/form>\n    <\/div>\n  );\n};\n\nexport default FormikYupLoginForm;<\/code><\/pre>\n<h4>Yup \u015eemas\u0131n\u0131n A\u00e7\u0131klamas\u0131<\/h4>\n<p>*   <strong><code>Yup.object().shape({...})<\/code><\/strong>: Formun genel yap\u0131s\u0131n\u0131 tan\u0131mlamak i\u00e7in kullan\u0131l\u0131r. \u0130\u00e7ine her bir form alan\u0131 i\u00e7in do\u011frulama kurallar\u0131n\u0131 i\u00e7eren bir nesne al\u0131r.<br \/>\n*   <strong><code>Yup.string()<\/code><\/strong>: Bu alan\u0131n bir string (metin) olmas\u0131n\u0131 bekledi\u011fimizi belirtir. Yup, <code>number()<\/code>, <code>boolean()<\/code>, <code>date()<\/code>, <code>array()<\/code>, <code>object()<\/code> gibi ba\u015fka t\u00fcrler de sunar.<br \/>\n*   <strong><code>.email('Hata Mesaj\u0131')<\/code><\/strong>: String&#8217;in ge\u00e7erli bir e-posta format\u0131nda olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. Ge\u00e7ersizse belirtilen hata mesaj\u0131n\u0131 g\u00f6sterir.<br \/>\n*   <strong><code>.required('Hata Mesaj\u0131')<\/code><\/strong>: Alan\u0131n bo\u015f b\u0131rak\u0131lamayaca\u011f\u0131n\u0131 belirtir.<br \/>\n*   <strong><code>.min(uzunluk, 'Hata Mesaj\u0131')<\/code><\/strong>: String&#8217;in minimum uzunlu\u011funu belirler.<br \/>\n*   <strong><code>.max(uzunluk, 'Hata Mesaj\u0131')<\/code><\/strong>: String&#8217;in maksimum uzunlu\u011funu belirler.<br \/>\n*   <strong><code>.matches(\/regex\/, 'Hata Mesaj\u0131')<\/code><\/strong>: String&#8217;in belirli bir d\u00fczenli ifadeye (regex) uyup uymad\u0131\u011f\u0131n\u0131 kontrol eder. \u00d6rne\u011fin, \u015fifrenin \u00f6zel karakter i\u00e7ermesi gibi daha karma\u015f\u0131k kurallar i\u00e7in kullan\u0131labilir.<\/p>\n<p>Yup \u015femas\u0131n\u0131 olu\u015fturduktan sonra, Formik&#8217;in <code>validationSchema<\/code> \u00f6zelli\u011fine atayarak entegrasyonu tamamlar\u0131z. Formik, dahili olarak bu \u015femay\u0131 kullanarak otomatik do\u011frulama yapar ve <code>formik.errors<\/code> ile <code>formik.touched<\/code> nesnelerini g\u00fcnceller. Bu, <code>validate<\/code> fonksiyonunu manuel olarak yazma ihtiyac\u0131n\u0131 tamamen ortadan kald\u0131r\u0131r ve do\u011frulama mant\u0131\u011f\u0131n\u0131 \u00e7ok daha d\u00fczenli bir hale getirir.<\/p>\n<h3>Kullan\u0131c\u0131 Deneyimini \u0130yile\u015ftirme<\/h3>\n<p>Form do\u011frulama sadece hatalar\u0131 yakalamakla kalmaz, ayn\u0131 zamanda kullan\u0131c\u0131ya ak\u0131c\u0131 ve bilgilendirici bir deneyim sunarak uygulaman\u0131n genel kalitesini art\u0131r\u0131r. Formik, kullan\u0131c\u0131 deneyimini iyile\u015ftirmek i\u00e7in \u00e7e\u015fitli \u00f6zellikler sunar.<\/p>\n<h4>Hata Mesajlar\u0131n\u0131n An\u0131nda G\u00f6sterilmesi (<code>onBlur<\/code>)<\/h4>\n<p>Kullan\u0131c\u0131lar\u0131n bir input alan\u0131na veri girerken veya girdikten hemen sonra hatalar hakk\u0131nda bilgi sahibi olmas\u0131 \u00f6nemlidir. <code>onBlur<\/code> olay\u0131, kullan\u0131c\u0131n\u0131n bir input alan\u0131ndan ayr\u0131ld\u0131\u011f\u0131nda tetiklenir. Formik&#8217;in <code>formik.handleBlur<\/code> \u00f6zelli\u011fi, bu olay\u0131 dinleyerek ilgili alan\u0131n <code>formik.touched<\/code> durumunu <code>true<\/code> yapar. B\u00f6ylece, hata mesajlar\u0131n\u0131 yaln\u0131zca kullan\u0131c\u0131 alan\u0131 terk ettikten sonra g\u00f6sterebiliriz:<\/p>\n<pre><code class=\"language-jsx\">{formik.touched.email && formik.errors.email && (\n  <div style={{ color: 'red', fontSize: '0.9em', marginTop: '5px' }}>{formik.errors.email}<\/div>\n)}<\/code><\/pre>\n<p>Bu, kullan\u0131c\u0131 daha input&#8217;u doldururken hata mesajlar\u0131yla bombard\u0131mana tutulmas\u0131n\u0131 engeller ve daha do\u011fal bir etkile\u015fim sa\u011flar.<\/p>\n<h4>Form G\u00f6nderim Durumu (<code>isSubmitting<\/code>)<\/h4>\n<p>Bir formu g\u00f6nderirken, kullan\u0131c\u0131ya formun i\u015flendi\u011fini bildirmek ve ayn\u0131 formu tekrar g\u00f6ndermesini engellemek iyi bir uygulamad\u0131r. Formik&#8217;in <code>formik.isSubmitting<\/code> \u00f6zelli\u011fi bu durumu y\u00f6netir. <code>onSubmit<\/code> fonksiyonunuzda <code>setSubmitting(true)<\/code> \u00e7a\u011fr\u0131s\u0131 yaparak bu \u00f6zelli\u011fi <code>true<\/code> yapabilir, i\u015flem bitti\u011finde ise <code>setSubmitting(false)<\/code> ile <code>false<\/code>&#8216;a d\u00f6nd\u00fcrebilirsiniz.<\/p>\n<pre><code class=\"language-jsx\"><button\n  type=\"submit\"\n  disabled={formik.isSubmitting} \/\/ G\u00f6nderim s\u0131ras\u0131nda butonu devre d\u0131\u015f\u0131 b\u0131rak\n  style={{ \/<em> ... <\/em>\/ }}\n>\n  {formik.isSubmitting ? 'G\u00f6nderiliyor...' : 'Giri\u015f Yap'}\n<\/button><\/code><\/pre>\n<p>Bu, kullan\u0131c\u0131ya geri bildirim sa\u011flar ve &#8220;\u00e7ift g\u00f6nderim&#8221; (double submission) gibi istenmeyen durumlar\u0131 \u00f6nler.<\/p>\n<h4>Geri Bildirim (Y\u00fckleniyor Spinner&#8217;\u0131, Ba\u015far\u0131\/Hata Mesajlar\u0131)<\/h4>\n<p>Form g\u00f6nderildikten sonra, kullan\u0131c\u0131ya i\u015flemin ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 veya bir hata olu\u015fup olu\u015fmad\u0131\u011f\u0131n\u0131 bildirmek \u00f6nemlidir. Bu genellikle bir &#8220;y\u00fckleniyor&#8221; spinner&#8217;\u0131, ge\u00e7ici ba\u015far\u0131 mesajlar\u0131 (toast bildirimleri) veya kal\u0131c\u0131 hata mesajlar\u0131 \u015feklinde yap\u0131labilir.<\/p>\n<p>\u00d6rne\u011fin, <code>onSubmit<\/code> i\u00e7inde bir API \u00e7a\u011fr\u0131s\u0131 yapt\u0131ktan sonra, <code>isSubmitting<\/code> durumuna ba\u011fl\u0131 olarak bir spinner g\u00f6sterebilir ve API yan\u0131t\u0131na g\u00f6re bir ba\u015far\u0131 veya hata mesaj\u0131 g\u00f6r\u00fcnt\u00fcleyebilirsiniz.<\/p>\n<pre><code class=\"language-jsx\">\/\/ onSubmit i\u00e7inde\nonSubmit: async (values, { setSubmitting, resetForm, setStatus }) => {\n  setSubmitting(true);\n  try {\n    \/\/ const response = await myApiClient.login(values.email, values.password);\n    \/\/ if (response.success) {\n      setStatus({ success: true, message: 'Giri\u015f ba\u015far\u0131l\u0131!' });\n      resetForm();\n    \/\/ } else {\n    \/\/   setStatus({ success: false, message: response.message || 'Giri\u015f ba\u015far\u0131s\u0131z oldu.' });\n    \/\/ }\n  } catch (error) {\n    setStatus({ success: false, message: error.message || 'Bir hata olu\u015ftu.' });\n  } finally {\n    setSubmitting(false);\n  }\n},\n\n\/\/ JSX i\u00e7inde\n{formik.status && formik.status.message && (\n  <div style={{ marginTop: '15px', color: formik.status.success ? 'green' : 'red' }}>\n    {formik.status.message}\n  <\/div>\n)}<\/code><\/pre>\n<p><code>formik.setStatus<\/code> Formik&#8217;in ek durum bilgilerini saklamak i\u00e7in kullanabilece\u011finiz bir yard\u0131mc\u0131d\u0131r.<\/p>\n<h3>Geli\u015fmi\u015f Formik \u00d6zellikleri ve En \u0130yi Uygulamalar<\/h3>\n<p>Formik, temel form y\u00f6netiminin \u00f6tesinde, daha karma\u015f\u0131k senaryolar ve performans optimizasyonu i\u00e7in \u00e7e\u015fitli geli\u015fmi\u015f \u00f6zellikler sunar.<\/p>\n<h4><code>FastField<\/code> Kullan\u0131m\u0131 (Performans Optimizasyonu)<\/h4>\n<p>Varsay\u0131lan olarak, bir Formik formundaki herhangi bir alan de\u011fi\u015fti\u011finde, Formik bile\u015feni yeniden render edilir ve bu da t\u00fcm <code><Field><\/code> bile\u015fenlerinin de yeniden render edilmesine neden olur. \u00c7o\u011fu form i\u00e7in bu bir sorun te\u015fkil etmezken, \u00e7ok say\u0131da input alan\u0131 olan veya karma\u015f\u0131k do\u011frulama mant\u0131\u011f\u0131na sahip b\u00fcy\u00fck formlarda performans d\u00fc\u015f\u00fc\u015f\u00fcne yol a\u00e7abilir.<\/p>\n<p><code><FastField><\/code> bile\u015feni, bu durumu optimize etmek i\u00e7in kullan\u0131l\u0131r. <code>FastField<\/code>, yaln\u0131zca kendi <code>name<\/code> \u00f6zelli\u011fiyle ili\u015fkili de\u011fer, hata veya dokunma durumu de\u011fi\u015fti\u011finde yeniden render edilir. Bu, gereksiz yeniden render&#8217;lar\u0131 engelleyerek performans\u0131 art\u0131rabilir.<\/p>\n<pre><code class=\"language-jsx\">import { Formik, Form, Field, ErrorMessage, FastField } from 'formik';\n\n\/\/ ...\n<Formik initialValues={...} validationSchema={...} onSubmit={...}>\n  <Form>\n    {\/<em> Normal Field <\/em>\/}\n    <Field type=\"email\" name=\"email\" \/>\n    <ErrorMessage name=\"email\" \/>\n\n    {\/<em> Performans kritik alanlar i\u00e7in FastField <\/em>\/}\n    <FastField type=\"password\" name=\"password\" \/>\n    <ErrorMessage name=\"password\" \/>\n  <\/Form>\n<\/Formik><\/code><\/pre>\n<p><code>useFormik<\/code> hook&#8217;unu kullan\u0131yorsan\u0131z, <code>FastField<\/code>&#8216;e e\u015fde\u011fer bir do\u011frudan hook yoktur. Ancak, kendi input bile\u015fenlerinizi <code>React.memo<\/code> ile sarmalayarak benzer bir optimizasyon sa\u011flayabilirsiniz.<\/p>\n<h4>Custom Input Bile\u015fenleri Olu\u015fturma<\/h4>\n<p>Formlar\u0131n\u0131zda tutarl\u0131 bir g\u00f6r\u00fcn\u00fcm ve davran\u0131\u015f sa\u011flamak i\u00e7in \u00f6zel input bile\u015fenleri olu\u015fturmak yayg\u0131n bir uygulamad\u0131r. Formik, bu \u00f6zel bile\u015fenlerle entegre olmay\u0131 kolayla\u015ft\u0131r\u0131r. \u00d6zel input bile\u015fenleriniz, Formik&#8217;in sa\u011flad\u0131\u011f\u0131 <code>field<\/code> ve <code>meta<\/code> prop&#8217;lar\u0131n\u0131 alarak Formik ile tam uyumlu hale getirilebilir.<\/p>\n<pre><code class=\"language-jsx\">import React from 'react';\nimport { useField } from 'formik';\n\nconst MyTextInput = ({ label, ...props }) => {\n  \/\/ useField() hook'u, Field'\u0131n prop'lar\u0131n\u0131 al\u0131p\n  \/\/ { field, meta } nesnelerini d\u00f6nd\u00fcr\u00fcr.\n  \/\/ field nesnesi, input'a ba\u011flanacak t\u00fcm prop'lar\u0131 i\u00e7erir (name, value, onChange, onBlur).\n  \/\/ meta nesnesi, o alan\u0131n meta verilerini i\u00e7erir (touched, error, value).\n  const [field, meta] = useField(props);\n  return (\n    <div style={{ marginBottom: '15px' }}>\n      <label htmlFor={props.id || props.name} style={{ display: 'block', marginBottom: '5px' }}>{label}<\/label>\n      <input\n        className=\"text-input\"\n        {...field}\n        {...props}\n        style={{ width: '100%', padding: '8px', boxSizing: 'border-box', border: '1px solid #ddd', borderRadius: '4px' }}\n      \/>\n      {meta.touched && meta.error ? (\n        <div style={{ color: 'red', fontSize: '0.9em', marginTop: '5px' }}>{meta.error}<\/div>\n      ) : null}\n    <\/div>\n  );\n};\n\n\/\/ FormikYupLoginForm i\u00e7inde kullan\u0131m\u0131:\n\/\/ <MyTextInput label=\"E-posta:\" name=\"email\" type=\"email\" \/>\n\/\/ <MyTextInput label=\"\u015eifre:\" name=\"password\" type=\"password\" \/><\/code><\/pre>\n<p>Bu yakla\u015f\u0131m, formunuzun UI kodunu basitle\u015ftirir, okunabilirli\u011fi art\u0131r\u0131r ve input bile\u015fenlerinizin yeniden kullan\u0131labilirli\u011fini sa\u011flar.<\/p>\n<h4>Formik Context&#8217;ini Kullanma (<code>useFormikContext<\/code>)<\/h4>\n<p>E\u011fer Formik&#8217;in <code><Formik><\/code> bile\u015fenini kullan\u0131yorsan\u0131z ve i\u00e7 i\u00e7e ge\u00e7mi\u015f bir bile\u015fende Formik&#8217;in durumuna veya y\u00f6ntemlerine eri\u015fmeniz gerekiyorsa, <code>useFormikContext<\/code> hook&#8217;unu kullanabilirsiniz. Bu hook, o anki Formik ba\u011flam\u0131n\u0131 (yani <code>formik<\/code> nesnesini) d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code class=\"language-jsx\">import React from 'react';\nimport { useFormikContext } from 'formik';\n\nconst SubmitButton = () => {\n  const { isSubmitting, isValid } = useFormikContext();\n  return (\n    <button type=\"submit\" disabled={isSubmitting || !isValid}>\n      {isSubmitting ? 'G\u00f6nderiliyor...' : 'G\u00f6nder'}\n    <\/button>\n  );\n};\n\n\/\/ <Formik> bile\u015feni i\u00e7inde kullan\u0131labilir\n\/\/ <Form>\n\/\/   <Field name=\"email\" \/>\n\/\/   <SubmitButton \/>\n\/\/ <\/Form><\/code><\/pre>\n<p><code>useFormik<\/code> hook&#8217;unu kullan\u0131rken, <code>formik<\/code> nesnesini do\u011frudan bile\u015fenler aras\u0131nda prop olarak ge\u00e7irebilirsiniz.<\/p>\n<h4>Formu S\u0131f\u0131rlama (<code>resetForm<\/code>)<\/h4>\n<p>Formu g\u00f6nderdikten veya belirli bir i\u015flemden sonra form de\u011ferlerini ba\u015flang\u0131\u00e7 de\u011ferlerine d\u00f6nd\u00fcrmek isteyebilirsiniz. <code>formik.resetForm()<\/code> y\u00f6ntemi bu i\u015flevi g\u00f6r\u00fcr. <code>onSubmit<\/code> callback&#8217;inde veya ba\u015fka bir yerde \u00e7a\u011fr\u0131larak formun state&#8217;i temizlenebilir.<\/p>\n<pre><code class=\"language-jsx\">onSubmit: (values, { setSubmitting, resetForm }) => {\n  \/\/ ... API \u00e7a\u011fr\u0131s\u0131\n  setTimeout(() => {\n    \/\/ ...\n    resetForm(); \/\/ Formu ba\u015flang\u0131\u00e7 de\u011ferlerine s\u0131f\u0131rla\n    setSubmitting(false);\n  }, 1000);\n}<\/code><\/pre>\n<h4>Formik ile UI K\u00fct\u00fcphanelerini Entegre Etme<\/h4>\n<p>Material-UI, Ant Design, Bootstrap gibi pop\u00fcler UI k\u00fct\u00fcphaneleriyle \u00e7al\u0131\u015f\u0131rken, Formik&#8217;i bu k\u00fct\u00fcphanelerin bile\u015fenleriyle entegre etmek isteyebilirsiniz. Bu genellikle, <code>useField<\/code> hook&#8217;unu kullanarak \u00f6zel input bile\u015fenleri olu\u015fturarak veya k\u00fct\u00fcphanenin kendi form bile\u015fenlerini Formik&#8217;in <code>handleChange<\/code>, <code>handleBlur<\/code>, <code>value<\/code> ve <code>error<\/code> prop&#8217;lar\u0131yla ba\u011flayarak yap\u0131l\u0131r.<\/p>\n<p>\u00d6rne\u011fin, Material-UI <code>TextField<\/code> bile\u015fenini Formik ile kullanmak i\u00e7in:<\/p>\n<pre><code class=\"language-jsx\">import React from 'react';\nimport { useField } from 'formik';\nimport { TextField } from '@mui\/material';\n\nconst FormikMuiTextField = ({ label, ...props }) => {\n  const [field, meta] = useField(props);\n  return (\n    <TextField\n      {...field}\n      {...props}\n      label={label}\n      error={meta.touched &#038;&#038; Boolean(meta.error)}\n      helperText={meta.touched &#038;&#038; meta.error}\n      fullWidth\n      margin=\"normal\"\n    \/>\n  );\n};\n\n\/\/ Kullan\u0131m:\n\/\/ <FormikMuiTextField name=\"email\" label=\"E-posta\" type=\"email\" \/><\/code><\/pre>\n<p>Bu, UI bile\u015fenlerinin Formik&#8217;in do\u011frulama ve durum y\u00f6netimi \u00f6zelliklerinden faydalanmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>G\u00fcvenlik \u0130pu\u00e7lar\u0131: \u0130stemci Taraf\u0131 Do\u011frulaman\u0131n S\u0131n\u0131rlar\u0131<\/h4>\n<p>Bu makale boyunca istemci taraf\u0131 do\u011frulaman\u0131n faydalar\u0131n\u0131 vurgulad\u0131k. Ancak, g\u00fcvenlik a\u00e7\u0131s\u0131ndan kritik bir noktay\u0131 tekrar belirtmek \u00f6nemlidir: <strong>istemci taraf\u0131 do\u011frulama, asla tek ba\u015f\u0131na yeterli de\u011fildir.<\/strong><\/p>\n<p>*   <strong>K\u00f6t\u00fc Niyetli Kullan\u0131c\u0131lar:<\/strong> \u0130stemci taraf\u0131 do\u011frulama, taray\u0131c\u0131da \u00e7al\u0131\u015f\u0131r ve kolayca atlat\u0131labilir (\u00f6rne\u011fin, taray\u0131c\u0131 geli\u015ftirici ara\u00e7lar\u0131 kullan\u0131larak veya do\u011frudan API \u00e7a\u011fr\u0131lar\u0131 yap\u0131larak).<br \/>\n*   <strong>Veri B\u00fct\u00fcnl\u00fc\u011f\u00fc:<\/strong> Sunucu taraf\u0131 do\u011frulama olmadan, hatal\u0131 veya k\u00f6t\u00fc niyetli veriler veritaban\u0131n\u0131za ula\u015fabilir ve uygulaman\u0131z\u0131n veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc bozabilir.<br \/>\n*   <strong>\u0130\u015f Mant\u0131\u011f\u0131:<\/strong> Baz\u0131 do\u011frulama kurallar\u0131, yaln\u0131zca sunucu taraf\u0131nda eri\u015filebilen verilere (\u00f6rne\u011fin, bir kullan\u0131c\u0131n\u0131n e-posta adresinin zaten kay\u0131tl\u0131 olup olmad\u0131\u011f\u0131) ba\u011fl\u0131 olabilir.<\/p>\n<p>Bu nedenle, her zaman hem istemci taraf\u0131nda (kullan\u0131c\u0131 deneyimi i\u00e7in) hem de sunucu taraf\u0131nda (g\u00fcvenlik ve veri b\u00fct\u00fcnl\u00fc\u011f\u00fc i\u00e7in) do\u011frulama yapmal\u0131s\u0131n\u0131z. Formik ve Yup, istemci taraf\u0131 do\u011frulamay\u0131 g\u00fc\u00e7l\u00fc ve verimli hale getirirken, sunucu taraf\u0131nda da benzer do\u011frulama mant\u0131\u011f\u0131n\u0131 uygulaman\u0131z gerekti\u011fini unutmay\u0131n.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, React uygulamalar\u0131nda giri\u015f formlar\u0131n\u0131 Formik ve Yup kullanarak nas\u0131l do\u011frulayaca\u011f\u0131m\u0131z\u0131 kapsaml\u0131 bir \u015fekilde inceledik. Form do\u011frulaman\u0131n \u00f6neminden ba\u015flayarak, Formik&#8217;in form y\u00f6netimini nas\u0131l basitle\u015ftirdi\u011fini, <code>useFormik<\/code> hook&#8217;unun temel kullan\u0131m\u0131n\u0131 ve Yup ile \u015fema tabanl\u0131 do\u011frulaman\u0131n g\u00fcc\u00fcn\u00fc ele ald\u0131k. Ayr\u0131ca, hata mesajlar\u0131n\u0131n an\u0131nda g\u00f6sterilmesi, g\u00f6nderim durumunun y\u00f6netilmesi ve \u00f6zel input bile\u015fenleri olu\u015fturma gibi kullan\u0131c\u0131 deneyimini iyile\u015ftiren tekniklere de de\u011findik.<\/p>\n<p>Formik ve Yup kombinasyonu, React geli\u015ftiricileri i\u00e7in formlarla \u00e7al\u0131\u015fmay\u0131 \u00e7ok daha keyifli ve verimli hale getiren g\u00fc\u00e7l\u00fc bir ara\u00e7 setidir. Geli\u015ftiricilerin, form state&#8217;i, do\u011frulama ve g\u00f6nderim gibi tekrar eden g\u00f6revlerle u\u011fra\u015fmak yerine, uygulaman\u0131n \u00e7ekirdek i\u015f mant\u0131\u011f\u0131na odaklanmas\u0131na olanak tan\u0131r. Bu sayede daha sa\u011flam, bak\u0131m\u0131 kolay ve kullan\u0131c\u0131 dostu formlar olu\u015fturulabilir.<\/p>\n<p>Unutulmamal\u0131d\u0131r ki, bu makalede ele al\u0131nan istemci taraf\u0131 do\u011frulama, kullan\u0131c\u0131 deneyimini iyile\u015ftirse de, g\u00fcvenlik ve veri b\u00fct\u00fcnl\u00fc\u011f\u00fc i\u00e7in her zaman sunucu taraf\u0131 do\u011frulama ile desteklenmelidir. Formik ve Yup&#8217;\u0131 kullanarak geli\u015ftirdi\u011finiz formlar, kullan\u0131c\u0131lar\u0131n\u0131z i\u00e7in daha g\u00fcvenli, daha h\u0131zl\u0131 ve daha keyifli bir deneyim sunacakt\u0131r. Bu bilgileri kullanarak, React projelerinizde karma\u015f\u0131k formlar\u0131 bile kolayca y\u00f6netebilir ve do\u011frulayabilirsiniz.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"React ve Formik ile Giri\u015f Formu Do\u011frulama: Kapsaml\u0131 Bir Rehber\nGiri\u015f: Form Do\u011frulaman\u0131n \u00d6nemi ve Neden Formik?\nModern web uygulamalar\u0131nda ku","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[128],"tags":[],"class_list":{"0":"post-37877","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-react","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>React ve Formik ile Giri\u015f Formu Do\u011frulama: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"React ve Formik ile Giri\u015f Formu Do\u011frulama: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"React ve Formik ile Giri\u015f Formu Do\u011frulama: Kapsaml\u0131 Bir Rehber Giri\u015f: Form Do\u011frulaman\u0131n \u00d6nemi ve Neden Formik? Modern web uygulamalar\u0131nda ku\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-17T14:40:59+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"21 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"React ve Formik ile Giri\u015f Formu Do\u011frulama: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2026-01-17T14:40:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/\"},\"wordCount\":3106,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"React\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/\",\"name\":\"React ve Formik ile Giri\u015f Formu Do\u011frulama: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-17T14:40:59+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"React ve Formik ile Giri\u015f Formu Do\u011frulama: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"React ve Formik ile Giri\u015f Formu Do\u011frulama: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"React ve Formik ile Giri\u015f Formu Do\u011frulama: Kapsaml\u0131 Bir Rehber","og_description":"React ve Formik ile Giri\u015f Formu Do\u011frulama: Kapsaml\u0131 Bir Rehber Giri\u015f: Form Do\u011frulaman\u0131n \u00d6nemi ve Neden Formik? Modern web uygulamalar\u0131nda ku","og_url":"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-17T14:40:59+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"21 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"React ve Formik ile Giri\u015f Formu Do\u011frulama: Kapsaml\u0131 Bir Rehber","datePublished":"2026-01-17T14:40:59+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/"},"wordCount":3106,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["React"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/","name":"React ve Formik ile Giri\u015f Formu Do\u011frulama: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-17T14:40:59+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/react-ve-formik-ile-giris-formu-dogrulama-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"React ve Formik ile Giri\u015f Formu Do\u011frulama: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37877","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=37877"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37877\/revisions"}],"predecessor-version":[{"id":37878,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37877\/revisions\/37878"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37877"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37877"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37877"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}