{"id":37893,"date":"2026-01-17T23:40:48","date_gmt":"2026-01-17T20:40:48","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=37893"},"modified":"2026-01-17T23:40:48","modified_gmt":"2026-01-17T20:40:48","slug":"psa-vue-jste-dogru-form-yonetimi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/","title":{"rendered":"PSA: Vue.js&#8217;te Do\u011fru Form Y\u00f6netimi"},"content":{"rendered":"<p><body><\/p>\n<h2>PSA: Vue.js&#8217;te Do\u011fru Form Y\u00f6netimi<\/h2>\n<p>Web uygulamalar\u0131n\u0131n temel ta\u015flar\u0131ndan biri olan formlar, kullan\u0131c\u0131 etkile\u015fiminin ve veri toplaman\u0131n merkezinde yer al\u0131r. Bir e-ticaret sitesinde \u00f6deme bilgilerini girmekten, bir sosyal medya platformunda g\u00f6nderi olu\u015fturmaya, bir kurumsal uygulamada veri giri\u015fi yapmaya kadar her yerde formlar kar\u015f\u0131m\u0131za \u00e7\u0131kar. Bu nedenle, formlar\u0131n do\u011fru, g\u00fcvenli ve kullan\u0131c\u0131 dostu bir \u015fekilde y\u00f6netilmesi, hem kullan\u0131c\u0131 deneyimi hem de uygulaman\u0131n genel sa\u011fl\u0131\u011f\u0131 i\u00e7in hayati \u00f6neme sahiptir. Vue.js gibi modern JavaScript \u00e7er\u00e7eveleri, form y\u00f6netimini kolayla\u015ft\u0131rmak i\u00e7in g\u00fc\u00e7l\u00fc ara\u00e7lar sunsa da, bu ara\u00e7lar\u0131n en iyi uygulamalarla birle\u015ftirilmesi, potansiyel tuzaklardan ka\u00e7\u0131nmak ve sa\u011flam, \u00f6l\u00e7eklenebilir \u00e7\u00f6z\u00fcmler olu\u015fturmak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p>Bu makalede, Vue.js&#8217;te form y\u00f6netiminin inceliklerini derinlemesine inceleyece\u011fiz. Temel <code>v-model<\/code> kullan\u0131m\u0131ndan ba\u015flayarak, farkl\u0131 giri\u015f t\u00fcrlerinin nas\u0131l ele al\u0131naca\u011f\u0131n\u0131, kapsaml\u0131 istemci ve sunucu taraf\u0131 do\u011frulama stratejilerini, form g\u00f6nderimi s\u0131ras\u0131ndaki durum y\u00f6netimini ve ileri d\u00fczey en iyi uygulamalar\u0131 ele alaca\u011f\u0131z. Amac\u0131m\u0131z, Vue.js projelerinizde formlar\u0131 yaln\u0131zca i\u015flevsel k\u0131lmakla kalmay\u0131p, ayn\u0131 zamanda bak\u0131m\u0131 kolay, g\u00fcvenli ve ola\u011fan\u00fcst\u00fc bir kullan\u0131c\u0131 deneyimi sunan yap\u0131lar haline getirmenize yard\u0131mc\u0131 olmakt\u0131r.<\/p>\n<h3>Vue.js&#8217;in Temel Form \u00d6zellikleri<\/h3>\n<p>Vue.js, form elemanlar\u0131yla \u00e7al\u0131\u015fmay\u0131 basitle\u015ftiren bir dizi yerle\u015fik y\u00f6nerge ve mekanizma sunar. Bu \u00f6zellikler, form verilerini uygulaman\u0131z\u0131n durumuyla senkronize etmeyi ve kullan\u0131c\u0131 etkile\u015fimlerine yan\u0131t vermeyi \u00e7ok daha kolay hale getirir.<\/p>\n<h4>v-model: \u0130ki Y\u00f6nl\u00fc Veri Ba\u011flaman\u0131n Kalbi<\/h4>\n<p><code>v-model<\/code> y\u00f6nergesi, Vue.js&#8217;te form giri\u015fleri ve uygulama durumu aras\u0131nda iki y\u00f6nl\u00fc veri ba\u011flaman\u0131n temelini olu\u015fturur. Bu, bir form giri\u015finin de\u011ferini de\u011fi\u015ftirdi\u011finizde, Vue \u00f6rne\u011finizdeki ilgili veri \u00f6zelli\u011finin otomatik olarak g\u00fcncellendi\u011fi ve ayn\u0131 \u015fekilde, veri \u00f6zelli\u011fini programatik olarak de\u011fi\u015ftirdi\u011finizde, form giri\u015finin de\u011ferinin de g\u00fcncellendi\u011fi anlam\u0131na gelir. Bu senkronizasyon, form verilerini y\u00f6netmeyi son derece basit ve sezgisel hale getirir.<\/p>\n<p>Arka planda, <code>v-model<\/code> asl\u0131nda iki \u015feyi yapar:<\/p>\n<ol>\n<li>Giri\u015f eleman\u0131n\u0131n <code>value<\/code> \u00f6zelli\u011fini bir veri \u00f6zelli\u011fine <code>v-bind<\/code> eder.<\/li>\n<li>Giri\u015f eleman\u0131n\u0131n <code>input<\/code> olay\u0131n\u0131 dinler ve <code>input<\/code> olay\u0131 tetiklendi\u011finde veri \u00f6zelli\u011fini g\u00fcnceller.<\/li>\n<\/ol>\n<p>Bu, a\u015fa\u011f\u0131daki iki kod par\u00e7as\u0131n\u0131n e\u015fde\u011fer oldu\u011fu anlam\u0131na gelir:<\/p>\n<pre><code class=\"language-html\"><input v-model=\"mesaj\"><\/code><\/pre>\n<pre><code class=\"language-html\"><input :value=\"mesaj\" @input=\"mesaj = $event.target.value\"><\/code><\/pre>\n<p><code>v-model<\/code>&#8216;\u0131n temel kullan\u0131m\u0131n\u0131 bir metin giri\u015fiyle inceleyelim:<\/p>\n<pre><code class=\"language-html\"><template>\n  <div>\n    <label for=\"kullaniciAdi\">Kullan\u0131c\u0131 Ad\u0131:<\/label>\n    <input type=\"text\" id=\"kullaniciAdi\" v-model=\"formData.kullaniciAdi\">\n    <p>Girilen Kullan\u0131c\u0131 Ad\u0131: {{ formData.kullaniciAdi }}<\/p>\n  <\/div>\n<\/template>\n\n<script>\nexport default {\n  data() {\n    return {\n      formData: {\n        kullaniciAdi: ''\n      }\n    };\n  }\n};\n<\/script><\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>formData.kullaniciAdi<\/code> \u00f6zelli\u011fi ile input eleman\u0131 aras\u0131nda iki y\u00f6nl\u00fc bir ba\u011f kurulmu\u015ftur. Kullan\u0131c\u0131 input alan\u0131na yaz\u0131 yazd\u0131k\u00e7a, <code>formData.kullaniciAdi<\/code> otomatik olarak g\u00fcncellenecek ve ekranda an\u0131nda yans\u0131t\u0131lacakt\u0131r.<\/p>\n<h4>v-model De\u011fi\u015ftiricileri (Modifiers)<\/h4>\n<p><code>v-model<\/code>, \u00f6zel davran\u0131\u015flar eklemek i\u00e7in de\u011fi\u015ftiricilerle birlikte kullan\u0131labilir:<\/p>\n<ul>\n<li><strong><code>.lazy<\/code><\/strong>: Varsay\u0131lan olarak, <code>v-model<\/code> her <code>input<\/code> olay\u0131nda veriyi senkronize eder. <code>.lazy<\/code> de\u011fi\u015ftiricisi, senkronizasyonu <code>change<\/code> olay\u0131na erteler. Bu, \u00f6zellikle b\u00fcy\u00fck metin alanlar\u0131 veya s\u0131k g\u00fcncellemelerin performans\u0131 etkileyebilece\u011fi durumlarda faydal\u0131 olabilir.<\/li>\n<pre><code class=\"language-html\"><input v-model.lazy=\"mesaj\"><\/code><\/pre>\n<li><strong><code>.number<\/code><\/strong>: Kullan\u0131c\u0131 girdisini otomatik olarak bir say\u0131ya d\u00f6n\u00fc\u015ft\u00fcrmeye \u00e7al\u0131\u015f\u0131r. E\u011fer d\u00f6n\u00fc\u015f\u00fcm ba\u015far\u0131s\u0131z olursa, orijinal dize de\u011feri d\u00f6nd\u00fcr\u00fcl\u00fcr.<\/li>\n<pre><code class=\"language-html\"><input v-model.number=\"yas\" type=\"number\"><\/code><\/pre>\n<li><strong><code>.trim<\/code><\/strong>: Kullan\u0131c\u0131 girdisindeki ba\u015ftaki ve sondaki bo\u015fluklar\u0131 otomatik olarak kald\u0131r\u0131r.<\/li>\n<pre><code class=\"language-html\"><input v-model.trim=\"email\"><\/code><\/pre>\n<\/ul>\n<h4>v-bind ve v-on: Daha Detayl\u0131 Kontrol<\/h4>\n<p>Baz\u0131 durumlarda, <code>v-model<\/code>&#8216;\u0131n sa\u011flad\u0131\u011f\u0131 iki y\u00f6nl\u00fc ba\u011flamadan daha detayl\u0131 kontrol veya tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131 isteyebilirsiniz. Bu gibi durumlarda, <code>v-bind<\/code> (k\u0131saca <code>:<\/code>) ve <code>v-on<\/code> (k\u0131saca <code>@<\/code>) y\u00f6nergelerini kullan\u0131r\u0131z.<\/p>\n<ul>\n<li><strong><code>v-bind<\/code><\/strong>: Bir HTML \u00f6zniteli\u011fini reaktif olarak bir Vue veri \u00f6zelli\u011fine ba\u011flamak i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, bir input&#8217;un <code>value<\/code> \u00f6zelli\u011fini programatik olarak ayarlamak i\u00e7in.<\/li>\n<li><strong><code>v-on<\/code><\/strong>: Bir DOM olay\u0131n\u0131 dinlemek ve olay tetiklendi\u011finde belirli bir JavaScript kodunu \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, bir input&#8217;un <code>input<\/code> veya <code>change<\/code> olay\u0131n\u0131 dinleyerek manuel veri g\u00fcncellemesi yapmak.<\/li>\n<\/ul>\n<p>Yukar\u0131daki <code>v-model<\/code> \u00f6rne\u011finin e\u015fde\u011ferini <code>v-bind<\/code> ve <code>v-on<\/code> ile zaten g\u00f6rm\u00fc\u015ft\u00fck. Bu y\u00f6nergeler, \u00f6zellikle dosya y\u00fckleme gibi <code>v-model<\/code>&#8216;\u0131n do\u011frudan \u00e7al\u0131\u015fmad\u0131\u011f\u0131 veya \u00f6zel bir veri i\u015fleme gerekti\u011fi durumlarda \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h3>Farkl\u0131 Form Giri\u015f T\u00fcrlerini Y\u00f6netme<\/h3>\n<p>Web formlar\u0131 sadece metin alanlar\u0131ndan ibaret de\u011fildir. Vue.js, \u00e7e\u015fitli giri\u015f t\u00fcrlerini tutarl\u0131 bir \u015fekilde ele almay\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<h4>Metin Giri\u015fleri ve Metin Alanlar\u0131 (<code><input type=\"text\"><\/code>, <code><textarea><\/code>)<\/h4>\n<p>Bu t\u00fcrler i\u00e7in <code>v-model<\/code> kullan\u0131m\u0131 en basittir ve yukar\u0131daki \u00f6rneklerde g\u00f6sterildi\u011fi gibi do\u011frudan bir veri \u00f6zelli\u011fine ba\u011flan\u0131r.<\/p>\n<pre><code class=\"language-html\"><input type=\"text\" v-model=\"formData.adSoyad\">\n<textarea v-model=\"formData.adres\"><\/textarea><\/code><\/pre>\n<h4>Onay Kutular\u0131 (Checkboxes)<\/h4>\n<p>Onay kutular\u0131, tek bir boolean de\u011feri veya bir dizi de\u011feri temsil edebilir.<\/p>\n<ul>\n<li><strong>Tekil Onay Kutusu:<\/strong> Bir boolean de\u011fere ba\u011flan\u0131r.<\/li>\n<pre><code class=\"language-html\"><input type=\"checkbox\" id=\"kurallariKabulEt\" v-model=\"formData.kurallariKabulEt\">\n<label for=\"kurallariKabulEt\">Kurallar\u0131 kabul ediyorum<\/label>\n<p>Kabul Edildi: {{ formData.kurallariKabulEt ? 'Evet' : 'Hay\u0131r' }}<\/p>\n\n\/\/ data: { formData: { kurallariKabulEt: false } }<\/code><\/pre>\n<li><strong>\u00c7oklu Onay Kutular\u0131:<\/strong> Ayn\u0131 <code>v-model<\/code>&#8216;\u0131 kullanan birden fazla onay kutusu, bir diziye ba\u011flanarak se\u00e7ili de\u011ferleri toplar. Her onay kutusu i\u00e7in bir <code>value<\/code> \u00f6zniteli\u011fi tan\u0131mlaman\u0131z gerekir.<\/li>\n<pre><code class=\"language-html\"><input type=\"checkbox\" id=\"meyveElma\" value=\"elma\" v-model=\"formData.secilenMeyveler\">\n<label for=\"meyveElma\">Elma<\/label>\n<input type=\"checkbox\" id=\"meyveArmut\" value=\"armut\" v-model=\"formData.secilenMeyveler\">\n<label for=\"meyveArmut\">Armut<\/label>\n<input type=\"checkbox\" id=\"meyveCilek\" value=\"\u00e7ilek\" v-model=\"formData.secilenMeyveler\">\n<label for=\"meyveCilek\">\u00c7ilek<\/label>\n<p>Se\u00e7ilen Meyveler: {{ formData.secilenMeyveler }}<\/p>\n\n\/\/ data: { formData: { secilenMeyveler: [] } }<\/code><\/pre>\n<\/ul>\n<h4>Radyo D\u00fc\u011fmeleri (Radio Buttons)<\/h4>\n<p>Radyo d\u00fc\u011fmeleri, bir grup se\u00e7enekten yaln\u0131zca birini se\u00e7meye izin verir. Ayn\u0131 <code>name<\/code> ve <code>v-model<\/code>&#8216;\u0131 payla\u015fan t\u00fcm radyo d\u00fc\u011fmeleri, tek bir veri \u00f6zelli\u011fine ba\u011flan\u0131r ve se\u00e7ilen d\u00fc\u011fmenin <code>value<\/code> de\u011ferini bu \u00f6zelli\u011fe atar.<\/p>\n<pre><code class=\"language-html\"><input type=\"radio\" id=\"cinsiyetErkek\" value=\"erkek\" v-model=\"formData.cinsiyet\">\n<label for=\"cinsiyetErkek\">Erkek<\/label>\n<input type=\"radio\" id=\"cinsiyetKadin\" value=\"kad\u0131n\" v-model=\"formData.cinsiyet\">\n<label for=\"cinsiyetKadin\">Kad\u0131n<\/label>\n<p>Se\u00e7ilen Cinsiyet: {{ formData.cinsiyet }}<\/p>\n\n\/\/ data: { formData: { cinsiyet: '' } }<\/code><\/pre>\n<h4>Se\u00e7im Kutular\u0131 (Select Dropdowns)<\/h4>\n<p>Se\u00e7im kutular\u0131, tek bir veya birden fazla se\u00e7ene\u011fi se\u00e7meye olanak tan\u0131r.<\/p>\n<ul>\n<li><strong>Tekil Se\u00e7im:<\/strong> Do\u011frudan bir veri \u00f6zelli\u011fine ba\u011flan\u0131r.<\/li>\n<pre><code class=\"language-html\"><select v-model=\"formData.secilenUlke\">\n  <option disabled value=\"\">L\u00fctfen bir \u00fclke se\u00e7iniz<\/option>\n  <option value=\"TR\">T\u00fcrkiye<\/option>\n  <option value=\"US\">Amerika Birle\u015fik Devletleri<\/option>\n  <option value=\"DE\">Almanya<\/option>\n<\/select>\n<p>Se\u00e7ilen \u00dclke: {{ formData.secilenUlke }}<\/p>\n\n\/\/ data: { formData: { secilenUlke: '' } }<\/code><\/pre>\n<li><strong>\u00c7oklu Se\u00e7im:<\/strong> <code>multiple<\/code> \u00f6zniteli\u011fi ile bir diziye ba\u011flan\u0131r.<\/li>\n<pre><code class=\"language-html\"><select v-model=\"formData.secilenDiller\" multiple>\n  <option value=\"TR\">T\u00fcrk\u00e7e<\/option>\n  <option value=\"EN\">\u0130ngilizce<\/option>\n  <option value=\"ES\">\u0130spanyolca<\/option>\n<\/select>\n<p>Se\u00e7ilen Diller: {{ formData.secilenDiller }}<\/p>\n\n\/\/ data: { formData: { secilenDiller: [] } }<\/code><\/pre>\n<\/ul>\n<h4>Dosya Giri\u015fleri (<code><input type=\"file\"><\/code>)<\/h4>\n<p>Dosya giri\u015fleri, g\u00fcvenlik k\u0131s\u0131tlamalar\u0131 nedeniyle <code>v-model<\/code> ile do\u011frudan \u00e7al\u0131\u015fmaz. Dosya verilerine eri\u015fmek i\u00e7in <code>change<\/code> olay\u0131n\u0131 dinlemeniz ve <code>event.target.files<\/code> \u00f6zelli\u011fini kullanman\u0131z gerekir.<\/p>\n<pre><code class=\"language-html\"><template>\n  <div>\n    <input type=\"file\" @change=\"handleFileUpload\">\n    <p v-if=\"secilenDosya\">Se\u00e7ilen Dosya: {{ secilenDosya.name }}<\/p>\n  <\/div>\n<\/template>\n\n<script>\nexport default {\n  data() {\n    return {\n      secilenDosya: null\n    };\n  },\n  methods: {\n    handleFileUpload(event) {\n      this.secilenDosya = event.target.files[0];\n    }\n  }\n};\n<\/script><\/code><\/pre>\n<h3>Form Do\u011frulamas\u0131 (Validation)<\/h3>\n<p>Form do\u011frulamas\u0131, kullan\u0131c\u0131 taraf\u0131ndan girilen verilerin uygulaman\u0131z\u0131n beklentilerini kar\u015f\u0131lad\u0131\u011f\u0131ndan emin olman\u0131n kritik bir ad\u0131m\u0131d\u0131r. Do\u011frulama hem istemci taraf\u0131nda (taray\u0131c\u0131da) hem de sunucu taraf\u0131nda (backend&#8217;de) yap\u0131lmal\u0131d\u0131r.<\/p>\n<h4>\u0130stemci Taraf\u0131 Do\u011frulama<\/h4>\n<p>\u0130stemci taraf\u0131 do\u011frulama, kullan\u0131c\u0131lara an\u0131nda geri bildirim sa\u011flayarak k\u00f6t\u00fc verilerin sunucuya g\u00f6nderilmesini engeller ve kullan\u0131c\u0131 deneyimini iyile\u015ftirir.<\/p>\n<h5>Temel HTML5 Do\u011frulamas\u0131<\/h5>\n<p>HTML5, form elemanlar\u0131na ekleyebilece\u011finiz yerle\u015fik do\u011frulama \u00f6znitelikleri sunar:<\/p>\n<ul>\n<li><code>required<\/code>: Alan\u0131n doldurulmas\u0131 gerekti\u011fini belirtir.<\/li>\n<li><code>minlength<\/code>, <code>maxlength<\/code>: Metin giri\u015fleri i\u00e7in minimum ve maksimum karakter uzunlu\u011funu belirler.<\/li>\n<li><code>min<\/code>, <code>max<\/code>: Say\u0131sal giri\u015fler i\u00e7in minimum ve maksimum de\u011feri belirler.<\/li>\n<li><code>type=\"email\"<\/code>, <code>type=\"url\"<\/code>: Giri\u015fin belirli bir formatta olmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><code>pattern<\/code>: D\u00fczenli ifade (regex) kullanarak \u00f6zel bir format tan\u0131mlaman\u0131z\u0131 sa\u011flar.<\/li>\n<\/ul>\n<pre><code class=\"language-html\"><input type=\"email\" required pattern=\"[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}$\">\n<input type=\"number\" min=\"18\" max=\"99\"><\/code><\/pre>\n<p>Bu \u00f6zellikler, taray\u0131c\u0131n\u0131n yerle\u015fik do\u011frulama mekanizmalar\u0131n\u0131 tetikler. Ancak, bu mekanizmalar\u0131n g\u00f6r\u00fcn\u00fcm\u00fc ve davran\u0131\u015flar\u0131 taray\u0131c\u0131dan taray\u0131c\u0131ya de\u011fi\u015febilir ve genellikle uygulaman\u0131z\u0131n tasar\u0131m\u0131na uymayabilir. Ayr\u0131ca, daha karma\u015f\u0131k do\u011frulama mant\u0131\u011f\u0131 i\u00e7in yeterli de\u011fildir.<\/p>\n<h5>Vue ile \u00d6zel Do\u011frulama Mant\u0131\u011f\u0131<\/h5>\n<p>Daha fazla kontrol ve \u00f6zelle\u015ftirme i\u00e7in, Vue&#8217;nun reaktif \u00f6zelliklerini kullanarak kendi do\u011frulama mant\u0131\u011f\u0131n\u0131z\u0131 uygulayabilirsiniz. Bu genellikle <code>computed<\/code> \u00f6zellikler veya <code>methods<\/code> kullan\u0131larak yap\u0131l\u0131r.<\/p>\n<pre><code class=\"language-html\"><template>\n  <form @submit.prevent=\"submitForm\">\n    <div>\n      <label for=\"email\">E-posta:<\/label>\n      <input type=\"email\" id=\"email\" v-model.trim=\"formData.email\" @blur=\"validateEmail\">\n      <p v-if=\"errors.email\" class=\"error-message\">{{ errors.email }}<\/p>\n    <\/div>\n    <div>\n      <label for=\"sifre\">\u015eifre:<\/label>\n      <input type=\"password\" id=\"sifre\" v-model=\"formData.sifre\" @blur=\"validateSifre\">\n      <p v-if=\"errors.sifre\" class=\"error-message\">{{ errors.sifre }}<\/p>\n    <\/div>\n    <button type=\"submit\" :disabled=\"!isFormValid\">G\u00f6nder<\/button>\n  <\/form>\n<\/template>\n\n<script>\nexport default {\n  data() {\n    return {\n      formData: {\n        email: '',\n        sifre: ''\n      },\n      errors: {\n        email: null,\n        sifre: null\n      },\n      isSubmitted: false \/\/ Formun en az bir kez g\u00f6nderilmeye \u00e7al\u0131\u015f\u0131l\u0131p \u00e7al\u0131\u015f\u0131lmad\u0131\u011f\u0131n\u0131 takip etmek i\u00e7in\n    };\n  },\n  computed: {\n    isEmailValid() {\n      if (!this.formData.email) return false;\n      \/\/ Basit bir e-posta regex kontrol\u00fc\n      return \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(this.formData.email);\n    },\n    isSifreValid() {\n      if (!this.formData.sifre) return false;\n      return this.formData.sifre.length >= 6;\n    },\n    isFormValid() {\n      return this.isEmailValid && this.isSifreValid;\n    }\n  },\n  methods: {\n    validateEmail() {\n      if (!this.formData.email) {\n        this.errors.email = 'E-posta alan\u0131 zorunludur.';\n      } else if (!this.isEmailValid) {\n        this.errors.email = 'Ge\u00e7erli bir e-posta adresi giriniz.';\n      } else {\n        this.errors.email = null;\n      }\n    },\n    validateSifre() {\n      if (!this.formData.sifre) {\n        this.errors.sifre = '\u015eifre alan\u0131 zorunludur.';\n      } else if (!this.isSifreValid) {\n        this.errors.sifre = '\u015eifre en az 6 karakter olmal\u0131d\u0131r.';\n      } else {\n        this.errors.sifre = null;\n      }\n    },\n    validateForm() {\n      this.validateEmail();\n      this.validateSifre();\n      return this.isFormValid;\n    },\n    submitForm() {\n      this.isSubmitted = true;\n      if (this.validateForm()) {\n        console.log('Form ge\u00e7erli, g\u00f6nderiliyor:', this.formData);\n        \/\/ Form g\u00f6nderme i\u015flemleri (API \u00e7a\u011fr\u0131s\u0131 vb.)\n        this.resetForm();\n      } else {\n        console.log('Form ge\u00e7erli de\u011fil.');\n      }\n    },\n    resetForm() {\n      this.formData.email = '';\n      this.formData.sifre = '';\n      this.errors.email = null;\n      this.errors.sifre = null;\n      this.isSubmitted = false;\n    }\n  }\n};\n<\/script>\n\n<style>\n.error-message {\n  color: red;\n  font-size: 0.9em;\n}\n<\/style><\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>computed<\/code> \u00f6zellikler her bir alan\u0131n ge\u00e7erlili\u011fini hesaplarken, <code>methods<\/code> i\u00e7inde <code>validateEmail<\/code> ve <code>validateSifre<\/code> fonksiyonlar\u0131 alanlar\u0131 kontrol eder ve <code>errors<\/code> nesnesini g\u00fcnceller. Form g\u00f6nderilmeden \u00f6nce <code>validateForm<\/code> \u00e7a\u011fr\u0131larak t\u00fcm alanlar\u0131n ge\u00e7erlili\u011fi kontrol edilir. <code>isSubmitted<\/code> bayra\u011f\u0131, kullan\u0131c\u0131n\u0131n formu g\u00f6ndermeye \u00e7al\u0131\u015fmadan \u00f6nce hata mesajlar\u0131n\u0131n g\u00f6sterilmesini engellemek i\u00e7in kullan\u0131labilir.<\/p>\n<h5>Do\u011frulama K\u00fct\u00fcphaneleri<\/h5>\n<p>Karma\u015f\u0131k formlar ve projeler i\u00e7in, VeeValidate veya Vuelidate gibi Vue i\u00e7in \u00f6zel olarak tasarlanm\u0131\u015f do\u011frulama k\u00fct\u00fcphanelerini kullanmak, do\u011frulama mant\u0131\u011f\u0131n\u0131 y\u00f6netmeyi ve hata mesajlar\u0131n\u0131 g\u00f6stermeyi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirebilir. Bu k\u00fct\u00fcphaneler, bir dizi yerle\u015fik kural, \u00f6zel kural tan\u0131mlama yetene\u011fi ve reaktif hata y\u00f6netimi sunar.<\/p>\n<h4>Sunucu Taraf\u0131 Do\u011frulama<\/h4>\n<p>\u0130stemci taraf\u0131 do\u011frulama, kullan\u0131c\u0131 deneyimi i\u00e7in harika olsa da, g\u00fcvenlik a\u00e7\u0131s\u0131ndan asla tek ba\u015f\u0131na yeterli de\u011fildir. K\u00f6t\u00fc niyetli kullan\u0131c\u0131lar istemci taraf\u0131 do\u011frulamay\u0131 kolayca atlayabilirler. Bu nedenle, sunucu taraf\u0131nda da her zaman kapsaml\u0131 do\u011frulama yap\u0131lmal\u0131d\u0131r.<\/p>\n<p>Sunucu taraf\u0131 do\u011frulama, API&#8217;nizin gelen verileri i\u015fleme almadan \u00f6nce do\u011frulamas\u0131 ve herhangi bir ge\u00e7ersizlik durumunda uygun hata kodlar\u0131 ve mesajlar\u0131yla yan\u0131t vermesi anlam\u0131na gelir (\u00f6rn. HTTP 400 Bad Request).<\/p>\n<h5>Sunucu Hatalar\u0131n\u0131 Vue.js&#8217;te Y\u00f6netme<\/h5>\n<p>Sunucudan gelen do\u011frulama hatalar\u0131n\u0131 kullan\u0131c\u0131ya g\u00f6stermek, form y\u00f6netiminin \u00f6nemli bir par\u00e7as\u0131d\u0131r. Genellikle, sunucu, hangi alan\u0131n ge\u00e7ersiz oldu\u011funu belirten bir hata nesnesi veya dizisi d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code class=\"language-javascript\">async submitForm() {\n  this.isSubmitted = true;\n  if (!this.validateForm()) {\n    return; \/\/ \u0130stemci taraf\u0131 do\u011frulama ba\u015far\u0131s\u0131z\n  }\n\n  this.isLoading = true;\n  this.serverError = null; \/\/ \u00d6nceki sunucu hatalar\u0131n\u0131 temizle\n\n  try {\n    const response = await axios.post('\/api\/register', this.formData);\n    console.log('Kay\u0131t ba\u015far\u0131l\u0131:', response.data);\n    this.resetForm();\n    \/\/ Ba\u015far\u0131 mesaj\u0131 g\u00f6ster\n  } catch (error) {\n    if (error.response && error.response.status === 400 && error.response.data.errors) {\n      \/\/ Sunucudan gelen do\u011frulama hatalar\u0131n\u0131 i\u015fle\n      const serverErrors = error.response.data.errors;\n      for (const field in serverErrors) {\n        if (this.errors.hasOwnProperty(field)) {\n          this.errors[field] = serverErrors[field][0]; \/\/ \u0130lk hatay\u0131 g\u00f6ster\n        } else {\n          \/\/ Genel bir hata mesaj\u0131 veya bilinmeyen alan hatas\u0131\n          this.serverError = 'Formda baz\u0131 hatalar olu\u015ftu. L\u00fctfen kontrol ediniz.';\n        }\n      }\n    } else {\n      this.serverError = 'Bir hata olu\u015ftu. L\u00fctfen daha sonra tekrar deneyin.';\n    }\n  } finally {\n    this.isLoading = false;\n  }\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>try-catch<\/code> blo\u011fu ile API \u00e7a\u011fr\u0131s\u0131 yap\u0131l\u0131r. E\u011fer sunucu 400 durum koduyla (Bad Request) yan\u0131t verir ve bir <code>errors<\/code> nesnesi i\u00e7eriyorsa, bu hatalar Vue bile\u015feninin <code>errors<\/code> nesnesine e\u015flenerek ilgili alanlar\u0131n alt\u0131nda g\u00f6sterilebilir. Di\u011fer durumlarda genel bir hata mesaj\u0131 kullan\u0131c\u0131ya sunulur.<\/p>\n<h3>Form G\u00f6nderimi ve Durum Y\u00f6netimi<\/h3>\n<p>Form g\u00f6nderimi, genellikle asenkron bir i\u015flemdir ve bu s\u00fcre\u00e7te kullan\u0131c\u0131ya do\u011fru geri bildirim sa\u011flamak i\u00e7in uygulaman\u0131n durumunu y\u00f6netmek \u00f6nemlidir.<\/p>\n<h4>G\u00f6nderim Olay\u0131n\u0131 Engelleme (<code>@submit.prevent<\/code>)<\/h4>\n<p>Bir HTML formu g\u00f6nderildi\u011finde, varsay\u0131lan olarak sayfa yeniden y\u00fcklenir. Vue.js&#8217;te tek sayfa uygulamalar\u0131 (SPA) geli\u015ftirdi\u011fimiz i\u00e7in bu davran\u0131\u015f\u0131 genellikle istemeyiz. <code>@submit.prevent<\/code> de\u011fi\u015ftiricisi, formun varsay\u0131lan g\u00f6nderim davran\u0131\u015f\u0131n\u0131 engeller:<\/p>\n<pre><code class=\"language-html\"><form @submit.prevent=\"submitForm\">\n  <!-- Form elemanlar\u0131 -->\n  <button type=\"submit\">G\u00f6nder<\/button>\n<\/form><\/code><\/pre>\n<h4>Y\u00fckleme, Hata ve Ba\u015far\u0131 Durumlar\u0131<\/h4>\n<p>Bir form g\u00f6nderildi\u011finde, kullan\u0131c\u0131ya i\u015flemin devam etti\u011fini, ba\u015far\u0131l\u0131 oldu\u011funu veya bir hata olu\u015ftu\u011funu bildirmek iyi bir kullan\u0131c\u0131 deneyimi sa\u011flar.<\/p>\n<ul>\n<li><strong><code>isLoading<\/code> (veya <code>isSubmitting<\/code>):<\/strong> Formun g\u00f6nderilmekte oldu\u011funu belirtir. Bu durumdayken g\u00f6nder d\u00fc\u011fmesini devre d\u0131\u015f\u0131 b\u0131rakmak ve bir y\u00fckleme g\u00f6stergesi g\u00f6stermek yayg\u0131n bir uygulamad\u0131r.<\/li>\n<li><strong><code>submissionError<\/code> (veya <code>serverError<\/code>):<\/strong> G\u00f6nderim s\u0131ras\u0131nda bir hata olu\u015ftu\u011funda bu hatay\u0131 saklar ve kullan\u0131c\u0131ya g\u00f6sterir.<\/li>\n<li><strong><code>submissionSuccess<\/code> (veya <code>successMessage<\/code>):<\/strong> G\u00f6nderim ba\u015far\u0131l\u0131 oldu\u011funda bir ba\u015far\u0131 mesaj\u0131 g\u00f6stermek i\u00e7in kullan\u0131l\u0131r.<\/li>\n<\/ul>\n<pre><code class=\"language-html\"><template>\n  <form @submit.prevent=\"submitForm\">\n    <!-- Form elemanlar\u0131 -->\n    <button type=\"submit\" :disabled=\"isLoading || !isFormValid\">\n      {{ isLoading ? 'G\u00f6nderiliyor...' : 'G\u00f6nder' }}\n    <\/button>\n\n    <p v-if=\"submissionError\" class=\"error-message\">{{ submissionError }}<\/p>\n    <p v-if=\"submissionSuccess\" class=\"success-message\">{{ submissionSuccess }}<\/p>\n  <\/form>\n<\/template>\n\n<script>\nexport default {\n  data() {\n    return {\n      \/\/ ... formData, errors ...\n      isLoading: false,\n      submissionError: null,\n      submissionSuccess: null\n    };\n  },\n  methods: {\n    async submitForm() {\n      \/\/ ... istemci taraf\u0131 do\u011frulama ...\n\n      this.isLoading = true;\n      this.submissionError = null;\n      this.submissionSuccess = null;\n\n      try {\n        await axios.post('\/api\/data', this.formData);\n        this.submissionSuccess = 'Veriler ba\u015far\u0131yla g\u00f6nderildi!';\n        this.resetForm();\n      } catch (error) {\n        this.submissionError = 'Veri g\u00f6nderilirken bir hata olu\u015ftu.';\n        \/\/ ... sunucu hatas\u0131 i\u015fleme ...\n      } finally {\n        this.isLoading = false;\n      }\n    },\n    resetForm() {\n      \/\/ Formu varsay\u0131lan de\u011ferlere s\u0131f\u0131rlama\n      this.formData = { email: '', sifre: '' };\n      this.errors = { email: null, sifre: null };\n      this.isSubmitted = false;\n    }\n  }\n};\n<\/script>\n\n<style>\n.success-message {\n  color: green;\n}\n<\/style><\/code><\/pre>\n<h3>\u0130leri D\u00fczey Konular ve En \u0130yi Uygulamalar<\/h3>\n<h4>Form Elemanlar\u0131n\u0131 Bile\u015fenlere Ay\u0131rma (Componentization)<\/h4>\n<p>B\u00fcy\u00fck ve karma\u015f\u0131k formlarda, her bir form eleman\u0131n\u0131 (input, select, checkbox vb.) ayr\u0131 Vue bile\u015fenleri olarak ele almak, kod tekrar\u0131n\u0131 azalt\u0131r, bak\u0131m\u0131 kolayla\u015ft\u0131r\u0131r ve yeniden kullan\u0131labilirli\u011fi art\u0131r\u0131r. Bu, \u00f6zellikle \u00f6zel stil veya do\u011frulama mant\u0131\u011f\u0131na sahip \u00f6zel giri\u015fler olu\u015ftururken faydal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-html\"><!-- CustomInput.vue -->\n<template>\n  <div class=\"form-group\">\n    <label :for=\"id\">{{ label }}<\/label>\n    <input\n      :type=\"type\"\n      :id=\"id\"\n      :value=\"modelValue\"\n      @input=\"$emit('update:modelValue', $event.target.value)\"\n      v-bind=\"$attrs\"\n    >\n    <p v-if=\"error\" class=\"error-message\">{{ error }}<\/p>\n  <\/div>\n<\/template>\n\n<script>\nexport default {\n  props: {\n    label: {\n      type: String,\n      required: true\n    },\n    id: {\n      type: String,\n      required: true\n    },\n    type: {\n      type: String,\n      default: 'text'\n    },\n    modelValue: { \/\/ v-model i\u00e7in prop\n      type: [String, Number],\n      default: ''\n    },\n    error: {\n      type: String,\n      default: null\n    }\n  },\n  \/\/ 'inheritAttrs: false' kullanarak root elemente otomatik atanmas\u0131n\u0131 engelleriz\n  \/\/ ve $attrs ile manuel olarak input'a atar\u0131z.\n  inheritAttrs: false\n};\n<\/script>\n\n<!-- Ana Bile\u015fende Kullan\u0131m -->\n<template>\n  <form>\n    <CustomInput\n      label=\"Kullan\u0131c\u0131 Ad\u0131\"\n      id=\"username\"\n      type=\"text\"\n      v-model=\"formData.username\"\n      :error=\"errors.username\"\n      placeholder=\"Kullan\u0131c\u0131 ad\u0131n\u0131z\u0131 girin\"\n    \/>\n    <CustomInput\n      label=\"E-posta\"\n      id=\"email\"\n      type=\"email\"\n      v-model=\"formData.email\"\n      :error=\"errors.email\"\n      required\n    \/>\n  <\/form>\n<\/template><\/code><\/pre>\n<p>Vue 3&#8217;te <code>v-model<\/code> bir bile\u015fen \u00fczerinde kullan\u0131ld\u0131\u011f\u0131nda, varsay\u0131lan olarak <code>modelValue<\/code> prop&#8217;unu ve <code>update:modelValue<\/code> olay\u0131n\u0131 kullan\u0131r. Bu, \u00f6zel giri\u015f bile\u015fenleri olu\u015fturmay\u0131 \u00e7ok daha sezgisel hale getirir. <code>v-bind=\"$attrs\"<\/code> ise, bile\u015fene ge\u00e7ilen ancak <code>props<\/code> i\u00e7inde tan\u0131mlanmayan t\u00fcm \u00f6znitelikleri (\u00f6rne\u011fin <code>placeholder<\/code>, <code>required<\/code>) do\u011frudan i\u00e7teki <code><input><\/code> eleman\u0131na iletir.<\/p>\n<h4>Eri\u015filebilirlik (Accessibility &#8211; A11y)<\/h4>\n<p>Formlar\u0131n eri\u015filebilir olmas\u0131, herkesin uygulaman\u0131z\u0131 kullanabilmesi i\u00e7in \u00e7ok \u00f6nemlidir. Baz\u0131 temel uygulamalar:<\/p>\n<ul>\n<li>Her form eleman\u0131 i\u00e7in bir <code><label><\/code> etiketi kullan\u0131n ve <code>for<\/code> \u00f6zniteli\u011fini ilgili eleman\u0131n <code>id<\/code>&#8216;siyle e\u015fle\u015ftirin. Bu, ekran okuyucular i\u00e7in kritik \u00f6neme sahiptir.<\/li>\n<li>Do\u011frulama hatalar\u0131n\u0131 a\u00e7\u0131k\u00e7a belirtin ve ekran okuyucular\u0131n bu hatalar\u0131 alg\u0131lamas\u0131 i\u00e7in <code>aria-live<\/code> veya <code>aria-describedby<\/code> gibi ARIA \u00f6zniteliklerini kullan\u0131n.<\/li>\n<li>Klavye ile gezilebilirli\u011fi sa\u011flay\u0131n (tab index).<\/li>\n<\/ul>\n<h4>Kullan\u0131c\u0131 Deneyimi (UX) \u0130pu\u00e7lar\u0131<\/h4>\n<ul>\n<li><strong>An\u0131nda Geri Bildirim:<\/strong> Kullan\u0131c\u0131 bir alan\u0131 doldururken veya bir alandan ayr\u0131l\u0131rken (on <code>blur<\/code> olay\u0131) do\u011frulama hatalar\u0131n\u0131 g\u00f6sterin. Ancak, kullan\u0131c\u0131 daha bir \u015fey yazmadan hata g\u00f6stermekten ka\u00e7\u0131n\u0131n.<\/li>\n<li><strong>A\u00e7\u0131k Hata Mesajlar\u0131:<\/strong> Hata mesajlar\u0131, sorunun ne oldu\u011funu ve nas\u0131l d\u00fczeltilece\u011fini net bir \u015fekilde belirtmelidir. &#8220;Ge\u00e7ersiz giri\u015f&#8221; yerine &#8220;E-posta adresi ge\u00e7erli bir formatta olmal\u0131d\u0131r&#8221; gibi.<\/li>\n<li><strong>G\u00f6nder D\u00fc\u011fmesini Devre D\u0131\u015f\u0131 B\u0131rakma:<\/strong> Form ge\u00e7erli olana kadar g\u00f6nder d\u00fc\u011fmesini devre d\u0131\u015f\u0131 b\u0131rakmak, gereksiz sunucu \u00e7a\u011fr\u0131lar\u0131n\u0131 \u00f6nler ve kullan\u0131c\u0131y\u0131 do\u011fru giri\u015fe y\u00f6nlendirir.<\/li>\n<li><strong>Y\u00fckleme G\u00f6stergeleri:<\/strong> Form g\u00f6nderilirken veya veri y\u00fcklenirken, kullan\u0131c\u0131ya bir y\u00fckleme g\u00f6stergesi sunarak uygulaman\u0131n kilitlenmedi\u011fi hissini verin.<\/li>\n<li><strong>Formu S\u0131f\u0131rlama:<\/strong> Ba\u015far\u0131l\u0131 bir g\u00f6nderimden sonra formu s\u0131f\u0131rlamak veya kullan\u0131c\u0131y\u0131 ba\u015fka bir sayfaya y\u00f6nlendirmek iyi bir uygulamad\u0131r.<\/li>\n<\/ul>\n<h4>G\u00fcvenlik Notlar\u0131<\/h4>\n<p>Vue.js, XSS (Cross-Site Scripting) sald\u0131r\u0131lar\u0131na kar\u015f\u0131 varsay\u0131lan olarak koruma sa\u011flar (<code>{{ }}<\/code> ile g\u00f6sterilen i\u00e7erik otomatik olarak ka\u00e7ar). Ancak, kullan\u0131c\u0131dan al\u0131nan verileri do\u011frudan HTML olarak render ediyorsan\u0131z (<code>v-html<\/code> kullanarak), dikkatli olmal\u0131s\u0131n\u0131z. Ayr\u0131ca, asla hassas verileri (\u015fifreler gibi) istemci taraf\u0131nda \u015fifrelemeyin veya do\u011frulama i\u00e7in yaln\u0131zca istemci taraf\u0131na g\u00fcvenmeyin. T\u00fcm hassas i\u015flemler ve do\u011frulama her zaman sunucu taraf\u0131nda yap\u0131lmal\u0131d\u0131r.<\/p>\n<h4>Performans Optimizasyonlar\u0131 (Debouncing\/Throttling)<\/h4>\n<p>Baz\u0131 durumlarda (\u00f6rne\u011fin, bir arama alan\u0131 veya an\u0131nda sunucu taraf\u0131 do\u011frulama), <code>input<\/code> olay\u0131nda \u00e7ok s\u0131k g\u00fcncelleme yapmak veya API \u00e7a\u011fr\u0131s\u0131 yapmak performans\u0131 etkileyebilir. Bu gibi durumlarda, <code>debounce<\/code> veya <code>throttle<\/code> tekniklerini kullanarak olay i\u015fleyicilerinin tetiklenme s\u0131kl\u0131\u011f\u0131n\u0131 s\u0131n\u0131rlayabilirsiniz.<\/p>\n<pre><code class=\"language-javascript\">\/\/ Bir yard\u0131mc\u0131 fonksiyon (lodash\/debounce veya kendi implementasyonunuz)\nimport debounce from 'lodash\/debounce';\n\nexport default {\n  data() {\n    return {\n      searchQuery: ''\n    };\n  },\n  created() {\n    \/\/ Arama sorgusu de\u011fi\u015fti\u011finde 500ms sonra search API'sini \u00e7a\u011f\u0131r\n    this.debouncedSearch = debounce(this.performSearch, 500);\n  },\n  watch: {\n    searchQuery(newVal) {\n      this.debouncedSearch(newVal);\n    }\n  },\n  methods: {\n    performSearch(query) {\n      if (query.length > 2) {\n        console.log('API \u00e7a\u011fr\u0131s\u0131 yap\u0131l\u0131yor:', query);\n        \/\/ API \u00e7a\u011fr\u0131s\u0131 burada yap\u0131l\u0131r\n      }\n    }\n  }\n};<\/code><\/pre>\n<h3>Sonu\u00e7<\/h3>\n<p>Vue.js&#8217;te form y\u00f6netimi, uygulaman\u0131z\u0131n kalitesi ve kullan\u0131c\u0131 deneyimi i\u00e7in merkezi bir rol oynar. <code>v-model<\/code> gibi temel \u00f6zellikler, form verilerini reaktif bir \u015fekilde y\u00f6netmeyi kolayla\u015ft\u0131r\u0131rken, farkl\u0131 giri\u015f t\u00fcrleri i\u00e7in \u00f6zel yakla\u015f\u0131mlar ve kapsaml\u0131 do\u011frulama stratejileri, sa\u011flam ve hatas\u0131z formlar olu\u015fturman\u0131n anahtar\u0131d\u0131r.<\/p>\n<p>\u0130stemci taraf\u0131 do\u011frulama ile an\u0131nda geri bildirim sa\u011flamak ve kullan\u0131c\u0131 deneyimini iyile\u015ftirmek, sunucu taraf\u0131 do\u011frulama ile ise veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc ve g\u00fcvenli\u011fi sa\u011flamak esast\u0131r. Form g\u00f6nderimi s\u0131ras\u0131nda y\u00fckleme, hata ve ba\u015far\u0131 durumlar\u0131n\u0131 net bir \u015fekilde y\u00f6netmek, kullan\u0131c\u0131ya g\u00fcven veren ve profesyonel bir his uyand\u0131ran bir aray\u00fcz sunar.<\/p>\n<p>Son olarak, form elemanlar\u0131n\u0131 bile\u015fenlere ay\u0131rma, eri\u015filebilirlik standartlar\u0131na uyma ve kullan\u0131c\u0131 deneyimini iyile\u015ftiren k\u00fc\u00e7\u00fck dokunu\u015flar, formlar\u0131n\u0131z\u0131n sadece i\u015flevsel olmas\u0131n\u0131 de\u011fil, ayn\u0131 zamanda keyifli ve herkes taraf\u0131ndan kullan\u0131labilir olmas\u0131n\u0131 sa\u011flar. Bu en iyi uygulamalar\u0131 benimseyerek, Vue.js projelerinizde formlar\u0131 bir g\u00fc\u00e7l\u00fck olmaktan \u00e7\u0131kar\u0131p, uygulaman\u0131z\u0131n en g\u00fc\u00e7l\u00fc ve kullan\u0131c\u0131 dostu y\u00f6nlerinden biri haline getirebilirsiniz. Unutmay\u0131n, iyi tasarlanm\u0131\u015f bir form, ba\u015far\u0131l\u0131 bir uygulaman\u0131n temelidir.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"PSA: Vue.js&#8217;te Do\u011fru Form Y\u00f6netimi\nWeb uygulamalar\u0131n\u0131n temel ta\u015flar\u0131ndan biri olan formlar, kullan\u0131c\u0131 etkile\u015fiminin ve veri toplaman\u0131n mer","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":[1402],"tags":[],"class_list":{"0":"post-37893","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-vue","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>PSA: Vue.js&#039;te Do\u011fru Form Y\u00f6netimi - 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\/psa-vue-jste-dogru-form-yonetimi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PSA: Vue.js&#039;te Do\u011fru Form Y\u00f6netimi\" \/>\n<meta property=\"og:description\" content=\"PSA: Vue.js&#039;te Do\u011fru Form Y\u00f6netimi Web uygulamalar\u0131n\u0131n temel ta\u015flar\u0131ndan biri olan formlar, kullan\u0131c\u0131 etkile\u015fiminin ve veri toplaman\u0131n mer\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-17T20:40:48+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=\"14 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"PSA: Vue.js&#8217;te Do\u011fru Form Y\u00f6netimi\",\"datePublished\":\"2026-01-17T20:40:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/\"},\"wordCount\":2448,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Vue\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/\",\"name\":\"PSA: Vue.js'te Do\u011fru Form Y\u00f6netimi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-17T20:40:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PSA: Vue.js&#8217;te Do\u011fru Form Y\u00f6netimi\"}]},{\"@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":"PSA: Vue.js'te Do\u011fru Form Y\u00f6netimi - 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\/psa-vue-jste-dogru-form-yonetimi\/","og_locale":"tr_TR","og_type":"article","og_title":"PSA: Vue.js'te Do\u011fru Form Y\u00f6netimi","og_description":"PSA: Vue.js'te Do\u011fru Form Y\u00f6netimi Web uygulamalar\u0131n\u0131n temel ta\u015flar\u0131ndan biri olan formlar, kullan\u0131c\u0131 etkile\u015fiminin ve veri toplaman\u0131n mer","og_url":"https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-17T20:40:48+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"14 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"PSA: Vue.js&#8217;te Do\u011fru Form Y\u00f6netimi","datePublished":"2026-01-17T20:40:48+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/"},"wordCount":2448,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Vue"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/","url":"https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/","name":"PSA: Vue.js'te Do\u011fru Form Y\u00f6netimi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-17T20:40:48+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/psa-vue-jste-dogru-form-yonetimi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PSA: Vue.js&#8217;te Do\u011fru Form Y\u00f6netimi"}]},{"@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\/37893","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=37893"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37893\/revisions"}],"predecessor-version":[{"id":37894,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37893\/revisions\/37894"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37893"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37893"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37893"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}