{"id":30778,"date":"2025-10-02T01:41:05","date_gmt":"2025-10-01T22:41:05","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=30778"},"modified":"2025-10-02T01:41:05","modified_gmt":"2025-10-01T22:41:05","slug":"vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/","title":{"rendered":"Vue.js ile Olaylar\u0131 Y\u00f6netme: Etkile\u015fimli Uygulamalar Geli\u015ftirmenin Anahtar\u0131"},"content":{"rendered":"<p><body><\/p>\n<h2>Vue.js ile Olaylar\u0131 Y\u00f6netme: Etkile\u015fimli Uygulamalar Geli\u015ftirmenin Anahtar\u0131<\/h2>\n<h2>Giri\u015f<\/h2>\n<p>Modern web uygulamalar\u0131, kullan\u0131c\u0131larla s\u00fcrekli etkile\u015fim halinde olan dinamik aray\u00fczler sunar. Bir d\u00fc\u011fmeye t\u0131klamak, bir form g\u00f6ndermek, klavye giri\u015fi yapmak veya fareyi hareket ettirmek gibi her kullan\u0131c\u0131 eylemi, uygulaman\u0131n belirli bir \u015fekilde tepki vermesini gerektirir. \u0130\u015fte bu noktada &#8220;olay y\u00f6netimi&#8221; devreye girer. Olay y\u00f6netimi, kullan\u0131c\u0131 eylemlerini dinlemek ve bu eylemlere kar\u015f\u0131l\u0131k gelen i\u015flevleri tetiklemek anlam\u0131na gelir. Etkile\u015fimli ve kullan\u0131c\u0131 dostu bir uygulama olu\u015fturmak i\u00e7in olaylar\u0131 etkili bir \u015fekilde y\u00f6netmek kritik \u00f6neme sahiptir.<\/p>\n<p>Vue.js, reaktif ve bile\u015fen tabanl\u0131 yap\u0131s\u0131yla olay y\u00f6netimini son derece sezgisel ve g\u00fc\u00e7l\u00fc bir hale getirir. Vue, HTML elemanlar\u0131 \u00fczerindeki yerel DOM olaylar\u0131ndan, bile\u015fenler aras\u0131 ileti\u015fimi sa\u011flayan \u00f6zel olaylara kadar geni\u015f bir yelpazede olay y\u00f6netimi mekanizmalar\u0131 sunar. Bu makale, Vue.js&#8217;te olaylar\u0131 nas\u0131l ele alaca\u011f\u0131m\u0131z\u0131, farkl\u0131 senaryolarda hangi yakla\u015f\u0131mlar\u0131 kullanaca\u011f\u0131m\u0131z\u0131 ve en iyi uygulamalar\u0131 derinlemesine inceleyecektir.<\/p>\n<h2>Vue.js&#8217;te Olay Y\u00f6netiminin Temelleri<\/h2>\n<p>Vue.js&#8217;te olay y\u00f6netimi, <code>v-on<\/code> direktifi etraf\u0131nda d\u00f6ner. Bu direktif, bir DOM olay\u0131n\u0131 dinlemek ve bir JavaScript ifadesini veya y\u00f6ntemi tetiklemek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h3>v-on Direktifi<\/h3>\n<p><code>v-on<\/code> direktifi, Vue.js&#8217;te olaylar\u0131 dinlemek i\u00e7in kullan\u0131lan temel ara\u00e7t\u0131r. S\u00f6zdizimi <code>v-on:event-name=\"methodName\"<\/code> veya <code>v-on:event-name=\"inlineExpression\"<\/code> \u015feklindedir.<\/p>\n<p>\u00d6rne\u011fin, bir d\u00fc\u011fmeye t\u0131klama olay\u0131n\u0131 dinlemek i\u00e7in:<\/p>\n<pre><code class=\"language-html\"><button v-on:click=\"handleClick\">Bana T\u0131kla<\/button><\/code><\/pre>\n<p>Vue.js, <code>v-on<\/code> i\u00e7in k\u0131sa bir yaz\u0131m \u015fekli sunar: <code>@<\/code>. Bu, kodunuzu daha okunabilir ve k\u0131sa hale getirir. Yukar\u0131daki \u00f6rnek <code>@<\/code> ile \u015fu \u015fekilde yaz\u0131labilir:<\/p>\n<pre><code class=\"language-html\"><button @click=\"handleClick\">Bana T\u0131kla<\/button><\/code><\/pre>\n<p>Bu \u00f6rnekte, kullan\u0131c\u0131 d\u00fc\u011fmeye t\u0131klad\u0131\u011f\u0131nda <code>handleClick<\/code> ad\u0131nda bir y\u00f6ntem tetiklenecektir. Bu y\u00f6ntem, Vue bile\u015feninizin <code>methods<\/code> se\u00e7ene\u011finde tan\u0131mlanm\u0131\u015f olmal\u0131d\u0131r.<\/p>\n<h3>Y\u00f6ntem \u0130\u015fleyiciler<\/h3>\n<p>Olaylar\u0131 y\u00f6netmek i\u00e7in genellikle do\u011frudan bir JavaScript ifadesi yerine bir y\u00f6ntem (method) kullanmak tercih edilir. Y\u00f6ntemler, daha karma\u015f\u0131k mant\u0131klar\u0131 kapsayabilir ve kodunuzu daha d\u00fczenli tutar.<\/p>\n<p>Bir Vue bile\u015feninde y\u00f6ntemler, <code>methods<\/code> se\u00e7ene\u011fi alt\u0131nda tan\u0131mlan\u0131r:<\/p>\n<pre><code class=\"language-javascript\">export default {\n  data() {\n    return {\n      sayac: 0\n    }\n  },\n  methods: {\n    handleClick() {\n      this.sayac++;\n      console.log('D\u00fc\u011fmeye t\u0131kland\u0131! Saya\u00e7:', this.sayac);\n    },\n    greet(name, event) {\n      console.log(<code>Merhaba, ${name}!<\/code>);\n      console.log('Yerel olay nesnesi:', event);\n    }\n  }\n}<\/code><\/pre>\n<p>HTML \u015fablonunda bu y\u00f6ntemleri \u015fu \u015fekilde kullanabiliriz:<\/p>\n<pre><code class=\"language-html\"><button @click=\"handleClick\">Sayac\u0131 Art\u0131r<\/button>\n<button @click=\"greet('Ahmet', $event)\">Ahmet'i Selamla<\/button><\/code><\/pre>\n<p><strong><code>this<\/code> Ba\u011flam\u0131:<\/strong> Y\u00f6ntem i\u015fleyicileri i\u00e7inde <code>this<\/code> anahtar kelimesi, her zaman Vue bile\u015fen \u00f6rne\u011fine i\u015faret eder. Bu sayede bile\u015fenin <code>data<\/code>, <code>computed<\/code> veya di\u011fer <code>methods<\/code> \u00f6zelliklerine eri\u015febilirsiniz.<\/p>\n<p><strong>Arg\u00fcman Ge\u00e7irme:<\/strong> Bir olay i\u015fleyicisine arg\u00fcmanlar ge\u00e7irmek m\u00fcmk\u00fcnd\u00fcr. E\u011fer bir y\u00f6nteme arg\u00fcman ge\u00e7irilirse, yerel DOM olay nesnesi (<code>event<\/code>) varsay\u0131lan olarak ge\u00e7irilmez. Ancak, <code>$event<\/code> \u00f6zel anahtar kelimesini kullanarak yerel DOM olay nesnesini a\u00e7\u0131k\u00e7a ge\u00e7irebilirsiniz. Yukar\u0131daki <code>greet<\/code> \u00f6rne\u011finde bu durum g\u00f6sterilmi\u015ftir. <code>greet('Ahmet', $event)<\/code> ifadesi, <code>Ahmet<\/code> string&#8217;ini ve olay nesnesini <code>greet<\/code> y\u00f6ntemine arg\u00fcman olarak iletir.<\/p>\n<h2>Olay De\u011fi\u015ftiriciler (Event Modifiers)<\/h2>\n<p>Vue.js, olay i\u015fleyicileri i\u00e7inde s\u0131k\u00e7a kullan\u0131lan mant\u0131klar\u0131 basitle\u015ftirmek i\u00e7in &#8220;olay de\u011fi\u015ftiriciler&#8221; sunar. Bu de\u011fi\u015ftiriciler, <code>v-on<\/code> direktifine bir nokta (<code>.<\/code>) ile eklenir ve olay i\u015fleyicilerinin davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirir.<\/p>\n<h3>.stop<\/h3>\n<p><code>event.stopPropagation()<\/code> \u00e7a\u011fr\u0131s\u0131 yaparak olay\u0131n yay\u0131lmas\u0131n\u0131 durdurur. Bu, i\u00e7 i\u00e7e ge\u00e7mi\u015f elemanlarda bir olay\u0131n sadece belirli bir eleman\u0131 etkilemesini istedi\u011finizde kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-html\"><div @click=\"divTiklandi\">\n  <button @click.stop=\"buttonTiklandi\">Bana T\u0131kla<\/button>\n<\/div><\/code><\/pre>\n<p>Bu \u00f6rnekte, d\u00fc\u011fmeye t\u0131kland\u0131\u011f\u0131nda sadece <code>buttonTiklandi<\/code> y\u00f6ntemi tetiklenecek, <code>divTiklandi<\/code> y\u00f6ntemi tetiklenmeyecektir.<\/p>\n<h3>.prevent<\/h3>\n<p><code>event.preventDefault()<\/code> \u00e7a\u011fr\u0131s\u0131 yaparak varsay\u0131lan taray\u0131c\u0131 davran\u0131\u015f\u0131n\u0131 engeller. \u00d6zellikle form g\u00f6nderimlerinde veya linklere t\u0131klamalarda sayfan\u0131n yenilenmesini engellemek i\u00e7in yayg\u0131n olarak kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-html\"><form @submit.prevent=\"formGonder\">\n  <input type=\"submit\" value=\"G\u00f6nder\">\n<\/form><\/code><\/pre>\n<p>Bu form g\u00f6nderildi\u011finde sayfa yenilenmeyecek, sadece <code>formGonder<\/code> y\u00f6ntemi \u00e7al\u0131\u015facakt\u0131r.<\/p>\n<h3>.capture<\/h3>\n<p>Olay i\u015fleyicisini, yakalama (capturing) a\u015famas\u0131nda tetikler. Normalde DOM olaylar\u0131 kabarc\u0131klanma (bubbling) a\u015famas\u0131nda tetiklenir.<\/p>\n<pre><code class=\"language-html\"><div @click.capture=\"divTiklandi\">\n  <button @click=\"buttonTiklandi\">Bana T\u0131kla<\/button>\n<\/div><\/code><\/pre>\n<p>Bu durumda, d\u00fc\u011fmeye t\u0131kland\u0131\u011f\u0131nda \u00f6nce <code>divTiklandi<\/code> (yakalama a\u015famas\u0131nda), sonra <code>buttonTiklandi<\/code> (kabarc\u0131klanma a\u015famas\u0131nda) tetiklenir.<\/p>\n<h3>.self<\/h3>\n<p>Sadece olay\u0131n kendisi taraf\u0131ndan tetiklenen elemandan kaynakland\u0131\u011f\u0131nda i\u015fleyiciyi \u00e7al\u0131\u015ft\u0131r\u0131r. Yani, olay eleman\u0131n kendisinde de\u011fil, \u00e7ocuk elemanlar\u0131ndan birinde tetiklenirse i\u015fleyici \u00e7al\u0131\u015fmaz.<\/p>\n<pre><code class=\"language-html\"><div @click.self=\"divTiklandi\">\n  <p>Bu bir paragraf.<\/p>\n  <button @click=\"buttonTiklandi\">D\u00fc\u011fme<\/button>\n<\/div><\/code><\/pre>\n<p>Bu \u00f6rnekte, <code><\/p>\n<p><\/code> veya <code><button><\/code>&#8216;a t\u0131kland\u0131\u011f\u0131nda <code>divTiklandi<\/code> \u00e7al\u0131\u015fmaz, ancak <code><\/p>\n<div><\/code>&#8216;un bo\u015f alan\u0131na t\u0131kland\u0131\u011f\u0131nda \u00e7al\u0131\u015f\u0131r.<\/p>\n<h3>.once<\/h3>\n<p>Olay i\u015fleyicisinin yaln\u0131zca bir kez tetiklenmesini sa\u011flar.<\/p>\n<pre><code class=\"language-html\"><button @click.once=\"sadeceBirKereTikla\">Sadece Bir Kere T\u0131kla<\/button><\/code><\/pre>\n<p>Bu d\u00fc\u011fmeye ilk t\u0131kland\u0131\u011f\u0131nda <code>sadeceBirKereTikla<\/code> \u00e7al\u0131\u015f\u0131r, sonraki t\u0131klamalarda \u00e7al\u0131\u015fmaz.<\/p>\n<h3>.passive<\/h3>\n<p>\u00d6zellikle kayd\u0131rma (scroll) olaylar\u0131nda performans\u0131 art\u0131rmak i\u00e7in kullan\u0131l\u0131r. Taray\u0131c\u0131ya, bu olay i\u015fleyicisinin <code>preventDefault()<\/code> \u00e7a\u011f\u0131rmayaca\u011f\u0131n\u0131 bildirir, b\u00f6ylece taray\u0131c\u0131 kayd\u0131rma i\u015flemini engelleme olas\u0131l\u0131\u011f\u0131na kar\u015f\u0131 beklemek zorunda kalmaz.<\/p>\n<pre><code class=\"language-html\"><div @scroll.passive=\"onScroll\">\n  Kayd\u0131r\u0131labilir \u0130\u00e7erik\n<\/div><\/code><\/pre>\n<p><code>.passive<\/code> de\u011fi\u015ftiricisi, mobil performans\u0131 i\u00e7in \u00f6nemlidir.<\/p>\n<p><strong>De\u011fi\u015ftiricileri Zincirleme:<\/strong> Birden fazla de\u011fi\u015ftiriciyi bir olay i\u015fleyicisine zincirleyerek uygulayabilirsiniz:<\/p>\n<pre><code class=\"language-html\"><a @click.prevent.stop=\"doSomething\">Link<\/a><\/code><\/pre>\n<p>Bu, linkin varsay\u0131lan davran\u0131\u015f\u0131n\u0131 engeller ve olay\u0131n yay\u0131lmas\u0131n\u0131 durdurur.<\/p>\n<h2>Tu\u015f De\u011fi\u015ftiriciler (Key Modifiers)<\/h2>\n<p>Klavye olaylar\u0131n\u0131 (\u00f6rne\u011fin <code>keydown<\/code>, <code>keyup<\/code>) dinlerken, belirli tu\u015flara bas\u0131ld\u0131\u011f\u0131nda i\u015fleyiciyi tetiklemek i\u00e7in tu\u015f de\u011fi\u015ftiricileri kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h3>\u00d6zel Tu\u015flar<\/h3>\n<p>Vue.js, s\u0131k kullan\u0131lan tu\u015flar i\u00e7in do\u011frudan takma adlar sa\u011flar:<br \/>\n&#8211; <code>.enter<\/code><br \/>\n&#8211; <code>.tab<\/code><br \/>\n&#8211; <code>.delete<\/code> (hem &#8220;Delete&#8221; hem de &#8220;Backspace&#8221; tu\u015flar\u0131 i\u00e7in)<br \/>\n&#8211; <code>.esc<\/code><br \/>\n&#8211; <code>.space<\/code><br \/>\n&#8211; <code>.up<\/code><br \/>\n&#8211; <code>.down<\/code><br \/>\n&#8211; <code>.left<\/code><br \/>\n&#8211; <code>.right<\/code><\/p>\n<p>\u00d6rnek:<\/p>\n<pre><code class=\"language-html\"><input @keyup.enter=\"submitForm\">\n<input @keyup.esc=\"clearInput\"><\/code><\/pre>\n<p>Kullan\u0131c\u0131 Enter tu\u015funa bast\u0131\u011f\u0131nda <code>submitForm<\/code> tetiklenir, Esc tu\u015funa bast\u0131\u011f\u0131nda <code>clearInput<\/code> tetiklenir.<\/p>\n<h3>Sistem Tu\u015flar\u0131<\/h3>\n<p>Ctrl, Alt, Shift ve Meta (Windows veya Command tu\u015fu) gibi sistem tu\u015flar\u0131n\u0131 da de\u011fi\u015ftirici olarak kullanabilirsiniz:<br \/>\n&#8211; <code>.ctrl<\/code><br \/>\n&#8211; <code>.alt<\/code><br \/>\n&#8211; <code>.shift<\/code><br \/>\n&#8211; <code>.meta<\/code><\/p>\n<p>\u00d6rnek:<\/p>\n<pre><code class=\"language-html\"><button @click.ctrl=\"doSomethingCtrl\">Ctrl + T\u0131kla<\/button>\n<input @keyup.shift.enter=\"submitMultiLineForm\"><\/code><\/pre>\n<p>Bu, Shift ve Enter tu\u015flar\u0131na ayn\u0131 anda bas\u0131ld\u0131\u011f\u0131nda <code>submitMultiLineForm<\/code> y\u00f6ntemini tetikler.<\/p>\n<h3>.exact De\u011fi\u015ftiricisi<\/h3>\n<p><code>.exact<\/code> de\u011fi\u015ftiricisi, sadece belirtilen sistem tu\u015flar\u0131n\u0131n bas\u0131l\u0131 olmas\u0131n\u0131 ve ba\u015fka hi\u00e7bir sistem tu\u015funun bas\u0131l\u0131 olmamas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-html\"><button @click.ctrl.exact=\"doSomething\">Sadece Ctrl + T\u0131kla<\/button>\n<button @click.shift.exact=\"doSomethingElse\">Sadece Shift + T\u0131kla<\/button><\/code><\/pre>\n<p>\u0130lk d\u00fc\u011fme, sadece Ctrl tu\u015fu bas\u0131l\u0131yken t\u0131klan\u0131rsa \u00e7al\u0131\u015f\u0131r. E\u011fer Ctrl ve Alt ayn\u0131 anda bas\u0131l\u0131ysa \u00e7al\u0131\u015fmaz.<\/p>\n<h2>Fare Tu\u015fu De\u011fi\u015ftiriciler (Mouse Button Modifiers)<\/h2>\n<p>Fare olaylar\u0131n\u0131 (\u00f6rne\u011fin <code>click<\/code>, <code>mousedown<\/code>, <code>mouseup<\/code>) dinlerken belirli fare tu\u015flar\u0131na (sol, sa\u011f, orta) bas\u0131ld\u0131\u011f\u0131nda i\u015fleyiciyi tetiklemek i\u00e7in fare tu\u015fu de\u011fi\u015ftiricileri kullan\u0131l\u0131r.<br \/>\n&#8211; <code>.left<\/code><br \/>\n&#8211; <code>.right<\/code><br \/>\n&#8211; <code>.middle<\/code><\/p>\n<p>\u00d6rnek:<\/p>\n<pre><code class=\"language-html\"><button @click.left=\"solTiklama\">Sol T\u0131kla<\/button>\n<button @click.right.prevent=\"sagTiklama\">Sa\u011f T\u0131kla (Varsay\u0131lan\u0131 Engelle)<\/button>\n<button @click.middle=\"ortaTiklama\">Orta T\u0131kla<\/button><\/code><\/pre>\n<p><code>@click.right.prevent<\/code> \u00f6rne\u011fi, sa\u011f t\u0131klama men\u00fcs\u00fcn\u00fcn a\u00e7\u0131lmas\u0131n\u0131 engelleyerek sadece <code>sagTiklama<\/code> y\u00f6ntemini tetikler.<\/p>\n<h2>\u00d6zel Olaylar (Custom Events)<\/h2>\n<p>Vue.js&#8217;te bile\u015fenler aras\u0131 ileti\u015fim, \u00f6zel olaylar arac\u0131l\u0131\u011f\u0131yla \u00f6nemli bir rol oynar. Genellikle, bir alt bile\u015fenin \u00fcst bile\u015fene bir \u015feyler oldu\u011funu bildirmesi gerekti\u011finde \u00f6zel olaylar kullan\u0131l\u0131r.<\/p>\n<h3><code>$emit<\/code><\/h3>\n<p>Alt bile\u015fenler, bir olay\u0131 tetiklemek (emit etmek) ve \u00fcst bile\u015fene veri g\u00f6ndermek i\u00e7in <code>$emit<\/code> y\u00f6ntemini kullan\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\/\/ ChildComponent.vue\nexport default {\n  methods: {\n    sendDataToParent() {\n      this.$emit('custom-event', 'Merhaba \u00fcst bile\u015fen!');\n    }\n  }\n}<\/code><\/pre>\n<p>HTML \u015fablonunda bir olayla tetiklenebilir:<\/p>\n<pre><code class=\"language-html\"><!-- ChildComponent.vue \u015fablonu -->\n<button @click=\"sendDataToParent\">\u00dcst Bile\u015fene Veri G\u00f6nder<\/button><\/code><\/pre>\n<h3>\u00d6zel Olaylar\u0131 Dinleme<\/h3>\n<p>\u00dcst bile\u015fen, alt bile\u015fenin tetikledi\u011fi \u00f6zel olaylar\u0131, yerel DOM olaylar\u0131n\u0131 dinledi\u011fi gibi <code>v-on<\/code> (veya <code>@<\/code>) direktifi ile dinler.<\/p>\n<pre><code class=\"language-html\"><!-- ParentComponent.vue \u015fablonu -->\n<template>\n  <ChildComponent @custom-event=\"handleCustomEvent\" \/>\n  <p>Alt bile\u015fenden gelen mesaj: {{ messageFromChild }}<\/p>\n<\/template>\n\n<script>\nimport ChildComponent from '.\/ChildComponent.vue';\n\nexport default {\n  components: {\n    ChildComponent\n  },\n  data() {\n    return {\n      messageFromChild: ''\n    }\n  },\n  methods: {\n    handleCustomEvent(payload) {\n      this.messageFromChild = payload;\n      console.log('Alt bile\u015fenden \u00f6zel olay tetiklendi:', payload);\n    }\n  }\n}\n<\/script><\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>ChildComponent<\/code> i\u00e7indeki d\u00fc\u011fmeye t\u0131kland\u0131\u011f\u0131nda <code>custom-event<\/code> olay\u0131 tetiklenir. <code>ParentComponent<\/code> bu olay\u0131 dinler ve <code>handleCustomEvent<\/code> y\u00f6ntemini \u00e7al\u0131\u015ft\u0131rarak <code>messageFromChild<\/code> verisini g\u00fcnceller.<\/p>\n<h3><code>defineEmits<\/code> (Composition API)<\/h3>\n<p>Composition API ile <code><script setup><\/code> kullan\u0131rken, \u00f6zel olaylar\u0131 tan\u0131mlamak ve emit etmek i\u00e7in <code>defineEmits<\/code> makrosu kullan\u0131l\u0131r. Bu, \u00f6zellikle TypeScript ile olaylar\u0131n tip g\u00fcvenli\u011fini sa\u011flamak i\u00e7in \u00f6nemlidir.<\/p>\n<pre><code class=\"language-html\"><!-- ChildComponent.vue (Composition API ile) -->\n<script setup>\nimport { ref } from 'vue';\n\nconst emit = defineEmits(['custom-event', 'another-event']); \/\/ Olaylar\u0131 tan\u0131mla\n\nconst message = ref('Merhaba \u00fcst bile\u015fen!');\n\nconst sendData = () => {\n  emit('custom-event', message.value);\n};\n\nconst sendAnotherData = (data) => {\n  emit('another-event', data);\n};\n<\/script>\n\n<template>\n  <button @click=\"sendData\">\u00dcst Bile\u015fene Veri G\u00f6nder<\/button>\n  <button @click=\"sendAnotherData('Farkl\u0131 bir mesaj')\">Ba\u015fka Veri G\u00f6nder<\/button>\n<\/template><\/code><\/pre>\n<p><code>defineEmits<\/code> ile tan\u0131mlanan olaylar, geli\u015ftirme s\u0131ras\u0131nda IDE'lerde otomatik tamamlama ve tip denetimi gibi avantajlar sunar.<\/p>\n<h2>Olay Veriyolu (Event Bus) - Global Olay Y\u00f6netimi<\/h2>\n<p>Bazen, birbirinden uzak (parent-child ili\u015fkisi olmayan) bile\u015fenler aras\u0131nda ileti\u015fim kurman\u0131z gerekebilir. Bu t\u00fcr senaryolarda \"olay veriyolu\" (event bus) kullan\u0131labilir. Bir olay veriyolu, basit bir Vue \u00f6rne\u011fi veya \u00f6zel bir k\u00fct\u00fcphane (<code>mitt<\/code> gibi) kullan\u0131larak olu\u015fturulan merkezi bir olay da\u011f\u0131t\u0131c\u0131s\u0131d\u0131r.<\/p>\n<p><strong>Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/strong><br \/>\n1.  Bir Vue \u00f6rne\u011fi veya <code>mitt<\/code> gibi bir k\u00fct\u00fcphane ile bir olay veriyolu olu\u015fturulur.<br \/>\n2.  Bile\u015fenler, bu olay veriyolu \u00fczerinde belirli olaylar\u0131 dinler (<code>on<\/code>).<br \/>\n3.  Di\u011fer bile\u015fenler, ayn\u0131 olay veriyolu \u00fczerinden olaylar\u0131 tetikler (<code>emit<\/code>).<\/p>\n<p><strong>Basit Bir Vue \u00d6rne\u011fi ile Olay Veriyolu:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ eventBus.js\nimport { createApp } from 'vue';\nexport const eventBus = createApp({});<\/code><\/pre>\n<p><strong>Bile\u015fen A (Olay\u0131 Tetikleyen):<\/strong><\/p>\n<pre><code class=\"language-html\"><!-- ComponentA.vue -->\n<script>\nimport { eventBus } from '.\/eventBus';\n\nexport default {\n  methods: {\n    triggerGlobalEvent() {\n      eventBus.emit('global-message', 'Bu global bir mesajd\u0131r!');\n    }\n  }\n}\n<\/script>\n\n<template>\n  <button @click=\"triggerGlobalEvent\">Global Olay\u0131 Tetikle<\/button>\n<\/template><\/code><\/pre>\n<p><strong>Bile\u015fen B (Olay\u0131 Dinleyen):<\/strong><\/p>\n<pre><code class=\"language-html\"><!-- ComponentB.vue -->\n<script>\nimport { eventBus } from '.\/eventBus';\n\nexport default {\n  data() {\n    return {\n      globalMessage: ''\n    }\n  },\n  mounted() {\n    \/\/ Bile\u015fen y\u00fcklendi\u011finde olay\u0131 dinlemeye ba\u015fla\n    eventBus.on('global-message', this.handleGlobalMessage);\n  },\n  beforeUnmount() {\n    \/\/ Bile\u015fen kald\u0131r\u0131lmadan \u00f6nce dinleyiciyi temizle\n    eventBus.off('global-message', this.handleGlobalMessage);\n  },\n  methods: {\n    handleGlobalMessage(message) {\n      this.globalMessage = message;\n      console.log('Global mesaj al\u0131nd\u0131:', message);\n    }\n  }\n}\n<\/script>\n\n<template>\n  <p>Al\u0131nan global mesaj: {{ globalMessage }}<\/p>\n<\/template><\/code><\/pre>\n<p><strong>Dezavantajlar\u0131 ve Alternatifleri:<\/strong><br \/>\nOlay veriyolu, k\u00fc\u00e7\u00fck uygulamalarda veya h\u0131zl\u0131 prototiplemelerde kullan\u0131\u015fl\u0131 olsa da, b\u00fcy\u00fck uygulamalarda izlemesi zor hale gelebilir. Hangi bile\u015fenin hangi olay\u0131 tetikledi\u011fini veya dinledi\u011fini anlamak karma\u015f\u0131kla\u015fabilir. Ayr\u0131ca, dinleyicileri temizlemeyi unutmak bellek s\u0131z\u0131nt\u0131lar\u0131na yol a\u00e7abilir (<code>beforeUnmount<\/code> ya\u015fam d\u00f6ng\u00fcs\u00fc kancas\u0131nda <code>eventBus.off<\/code> \u00e7a\u011fr\u0131s\u0131 \u00f6nemlidir).<\/p>\n<p>Daha b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalar i\u00e7in, merkezi durum y\u00f6netimi k\u00fct\u00fcphaneleri (Vuex veya Pinia) daha uygun bir \u00e7\u00f6z\u00fcmd\u00fcr. Bu k\u00fct\u00fcphaneler, durumun ve durum de\u011fi\u015fikliklerinin daha \u00f6ng\u00f6r\u00fclebilir ve izlenebilir bir \u015fekilde y\u00f6netilmesini sa\u011flar.<\/p>\n<h2>Reactive Event Handling with Composition API<\/h2>\n<p>Composition API, olay y\u00f6netimi i\u00e7in temel olarak Options API'dakiyle ayn\u0131 <code>v-on<\/code> direktifini kullan\u0131r. Ancak, y\u00f6ntemlerin tan\u0131mlanma ve y\u00f6netilme \u015fekli farkl\u0131d\u0131r.<\/p>\n<h3><code>@<\/code> ve <code>v-on<\/code> Kullan\u0131m\u0131<\/h3>\n<p>\u015eablon taraf\u0131nda olay dinleme mekanizmas\u0131 ayn\u0131 kal\u0131r:<\/p>\n<pre><code class=\"language-html\"><template>\n  <button @click=\"handleClick\">T\u0131kla<\/button>\n  <input @keyup.enter=\"handleEnter\">\n<\/template><\/code><\/pre>\n<h3>Methods in <code>setup()<\/code><\/h3>\n<p>Composition API'da olay i\u015fleyicileri, <code>setup()<\/code> fonksiyonu i\u00e7inde do\u011frudan JavaScript fonksiyonlar\u0131 olarak tan\u0131mlan\u0131r. Bu fonksiyonlar, bile\u015fenin reaktif durumuyla do\u011frudan etkile\u015fim kurabilir.<\/p>\n<pre><code class=\"language-html\"><!-- MyComponent.vue (Composition API ile) -->\n<script setup>\nimport { ref } from 'vue';\n\nconst count = ref(0);\n\nconst handleClick = () => {\n  count.value++;\n  console.log('Saya\u00e7:', count.value);\n};\n\nconst handleEnter = (event) => {\n  console.log('Enter tu\u015funa bas\u0131ld\u0131, de\u011fer:', event.target.value);\n};\n\n\/\/ Olay dinleyicisi i\u00e7in arg\u00fcman ge\u00e7irme\nconst greet = (name) => {\n  console.log(<code>Merhaba, ${name}!<\/code>);\n};\n<\/script>\n\n<template>\n  <button @click=\"handleClick\">Sayac\u0131 Art\u0131r: {{ count }}<\/button>\n  <input @keyup.enter=\"handleEnter\" placeholder=\"Enter'a bas\">\n  <button @click=\"greet('Ay\u015fe')\">Ay\u015fe'yi Selamla<\/button>\n<\/template><\/code><\/pre>\n<p><code>setup()<\/code> i\u00e7inde tan\u0131mlanan fonksiyonlar do\u011frudan \u015fablonda kullan\u0131labilir. <code>this<\/code> anahtar kelimesi Composition API'da genellikle kullan\u0131lmaz; reaktif verilere <code>ref<\/code> veya <code>reactive<\/code> arac\u0131l\u0131\u011f\u0131yla do\u011frudan eri\u015filir.<\/p>\n<h3><code>useEventListener<\/code> (VueUse)<\/h3>\n<p>Daha geli\u015fmi\u015f senaryolar veya DOM olaylar\u0131n\u0131 do\u011frudan y\u00f6netmek i\u00e7in VueUse gibi k\u00fct\u00fcphanelerdeki composable fonksiyonlar kullan\u0131labilir. \u00d6rne\u011fin, <code>useEventListener<\/code> fonksiyonu, bir DOM eleman\u0131na veya global <code>window<\/code>\/<code>document<\/code> nesnesine olay dinleyicileri eklemeyi ve bunlar\u0131 bile\u015fenin ya\u015fam d\u00f6ng\u00fcs\u00fcyle otomatik olarak temizlemeyi kolayla\u015ft\u0131r\u0131r.<\/p>\n<pre><code class=\"language-html\"><script setup>\nimport { ref, onMounted, onUnmounted } from 'vue';\nimport { useEventListener } from '@vueuse\/core'; \/\/ VueUse'dan\n\nconst mouseX = ref(0);\nconst mouseY = ref(0);\n\nconst updateMousePosition = (event) => {\n  mouseX.value = event.clientX;\n  mouseY.value = event.clientY;\n};\n\n\/\/ useEventListener ile mousemove olay\u0131n\u0131 dinle\nuseEventListener(window, 'mousemove', updateMousePosition);\n\n\/\/ Veya manuel olarak:\n\/\/ onMounted(() => {\n\/\/   window.addEventListener('mousemove', updateMousePosition);\n\/\/ });\n\/\/ onUnmounted(() => {\n\/\/   window.removeEventListener('mousemove', updateMousePosition);\n\/\/ });\n<\/script>\n\n<template>\n  <p>Fare Konumu: {{ mouseX }}, {{ mouseY }}<\/p>\n<\/template><\/code><\/pre>\n<p><code>useEventListener<\/code> gibi ara\u00e7lar, \u00f6zellikle global olay dinleyicilerini y\u00f6netirken temizleme i\u015flemini otomatikle\u015ftirerek geli\u015ftirici deneyimini iyile\u015ftirir.<\/p>\n<h2>En \u0130yi Uygulamalar ve \u0130pu\u00e7lar\u0131<\/h2>\n<p>Etkili olay y\u00f6netimi i\u00e7in baz\u0131 en iyi uygulamalar \u015funlard\u0131r:<\/p>\n<p>1.  <strong>Olay \u0130\u015fleyicileri Yal\u0131n Tutun:<\/strong> Olay i\u015fleyicileriniz (methods) sadece olay\u0131 i\u015flemekten sorumlu olmal\u0131 ve karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131n\u0131 ba\u015fka fonksiyonlara veya yard\u0131mc\u0131 mod\u00fcllere delege etmelidir. Bu, kodunuzu daha okunabilir ve test edilebilir yapar.<br \/>\n2.  <strong>Sorumluluklar\u0131 Ay\u0131r\u0131n:<\/strong> \u015eablonunuzu sadece yap\u0131 ve temel olay ba\u011flamalar\u0131 i\u00e7in kullan\u0131n. Karma\u015f\u0131k mant\u0131\u011f\u0131 JavaScript k\u0131sm\u0131nda (methods veya setup()) tutun.<br \/>\n3.  <strong>De\u011fi\u015ftiricileri Ak\u0131ll\u0131ca Kullan\u0131n:<\/strong> Olay de\u011fi\u015ftiriciler, s\u0131k kar\u015f\u0131la\u015f\u0131lan senaryolar\u0131 basit ve deklaratif bir \u015fekilde \u00e7\u00f6zmek i\u00e7in harikad\u0131r. Gereksiz yere <code>event.stopPropagation()<\/code> veya <code>event.preventDefault()<\/code> gibi manuel DOM API \u00e7a\u011fr\u0131lar\u0131 yapmaktan ka\u00e7\u0131n\u0131n.<br \/>\n4.  <strong>\u00d6zel Olaylar\u0131 Anlaml\u0131 Adland\u0131r\u0131n:<\/strong> \u00d6zel olay adlar\u0131, neyi temsil ettiklerini a\u00e7\u0131k\u00e7a belirtmelidir (\u00f6rne\u011fin, <code>item-selected<\/code>, <code>user-deleted<\/code>, <code>form-submitted<\/code>). Genellikle kebab-case kullan\u0131l\u0131r.<br \/>\n5.  <strong>Global Olay Dinleyicilerini Temizleyin:<\/strong> E\u011fer bir olay veriyolu kullan\u0131yorsan\u0131z veya do\u011frudan DOM'a <code>addEventListener<\/code> ile dinleyici ekliyorsan\u0131z, bile\u015fen kald\u0131r\u0131ld\u0131\u011f\u0131nda bu dinleyicileri temizlemeyi (<code>eventBus.off<\/code>, <code>removeEventListener<\/code>) unutmay\u0131n. Bu, bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nler. Composition API'da <code>onUnmounted<\/code> ya\u015fam d\u00f6ng\u00fcs\u00fc kancas\u0131 bu ama\u00e7la kullan\u0131l\u0131r.<br \/>\n6.  <strong>Eri\u015filebilirli\u011fi G\u00f6z \u00d6n\u00fcnde Bulundurun:<\/strong> Klavye navigasyonu ve ekran okuyucular gibi eri\u015filebilirlik konular\u0131n\u0131 unutmay\u0131n. \u00d6rne\u011fin, sadece <code>click<\/code> olay\u0131na g\u00fcvenmek yerine, klavye olaylar\u0131n\u0131 (<code>keyup.enter<\/code>, <code>keyup.space<\/code>) da dinleyerek d\u00fc\u011fmelerin klavye ile de \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flay\u0131n.<br \/>\n7.  <strong>Form Giri\u015flerini <code>v-model<\/code> ile Y\u00f6netin:<\/strong> Form elemanlar\u0131 i\u00e7in <code>input<\/code> ve <code>change<\/code> olaylar\u0131n\u0131 manuel olarak y\u00f6netmek yerine, <code>v-model<\/code> direktifini kullanarak iki y\u00f6nl\u00fc veri ba\u011flamas\u0131n\u0131 tercih edin. Bu, form y\u00f6netimini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir.<\/p>\n<h2>S\u0131k Kar\u015f\u0131la\u015f\u0131lan Hatalar<\/h2>\n<p>Vue.js ile olaylar\u0131 y\u00f6netirken yap\u0131lan baz\u0131 yayg\u0131n hatalar:<\/p>\n<p>1.  <strong><code>this<\/code> Ba\u011flam\u0131n\u0131 Unutmak (Options API):<\/strong> Y\u00f6ntemler i\u00e7inde <code>this<\/code> anahtar kelimesinin Vue bile\u015fen \u00f6rne\u011fine i\u015faret etti\u011fini unutmak, <code>data<\/code> veya di\u011fer y\u00f6ntemlere eri\u015fim sorunlar\u0131na yol a\u00e7abilir. Ok (arrow) fonksiyonlar\u0131 kullan\u0131rken <code>this<\/code> ba\u011flam\u0131 farkl\u0131 davran\u0131r, bu y\u00fczden dikkatli olun.<br \/>\n2.  <strong>Olay Dinleyicilerini Temizlemeyi Unutmak:<\/strong> \u00d6zellikle <code>window<\/code> veya <code>document<\/code> gibi global nesnelere eklenen veya olay veriyolu ile kullan\u0131lan dinleyicilerin bile\u015fen kald\u0131r\u0131ld\u0131\u011f\u0131nda temizlenmemesi, bellek s\u0131z\u0131nt\u0131lar\u0131na ve istenmeyen davran\u0131\u015flara neden olabilir.<br \/>\n3.  <strong>Olay Veriyolunu A\u015f\u0131r\u0131 Kullanmak:<\/strong> Olay veriyolu, basit ileti\u015fimler i\u00e7in pratik olsa da, karma\u015f\u0131k ve b\u00fcy\u00fck uygulamalarda h\u0131zl\u0131ca y\u00f6netilemez hale gelebilir. Durum y\u00f6netimi k\u00fct\u00fcphaneleri veya prop\/emit hiyerar\u015fisi daha iyi alternatiflerdir.<br \/>\n4.  <strong>Olay Yay\u0131l\u0131m\u0131n\u0131 Yanl\u0131\u015f Anlamak:<\/strong> <code>event.stopPropagation()<\/code> veya <code>.stop<\/code> de\u011fi\u015ftiricisini ne zaman kullanaca\u011f\u0131n\u0131z\u0131 bilmemek, istenmeyen olay tetiklemelerine yol a\u00e7abilir.<br \/>\n5.  <strong>Yerel DOM Olay\u0131 ve \u00d6zel Olaylar\u0131 Kar\u0131\u015ft\u0131rmak:<\/strong> Bir bile\u015fen \u00fczerinde <code>v-on:click<\/code> kullanmak, DOM'daki <code>click<\/code> olay\u0131n\u0131 dinler. Ancak \u00f6zel bir bile\u015fen \u00fczerinde <code>v-on:custom-event<\/code> kullanmak, o bile\u015fenin <code>$emit<\/code> ile tetikledi\u011fi \u00f6zel olay\u0131 dinler. Bu ayr\u0131m\u0131 anlamak \u00f6nemlidir.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Vue.js'in olay y\u00f6netim sistemi, web uygulamalar\u0131n\u0131 etkile\u015fimli ve dinamik hale getirmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek ara\u00e7lar sunar. <code>v-on<\/code> direktifinden olay de\u011fi\u015ftiricilere, \u00f6zel olaylardan Composition API'daki reaktif yakla\u015f\u0131mlara kadar, Vue geli\u015ftiricilere her t\u00fcrl\u00fc senaryo i\u00e7in uygun \u00e7\u00f6z\u00fcmler sunar.<\/p>\n<p>Etkili olay y\u00f6netimi, sadece kodunuzu daha temiz ve bak\u0131m\u0131 kolay hale getirmekle kalmaz, ayn\u0131 zamanda kullan\u0131c\u0131lara sorunsuz ve duyarl\u0131 bir deneyim sunar. Bu makalede ele al\u0131nan kavramlar\u0131 ve en iyi uygulamalar\u0131 anlayarak ve uygulayarak, Vue.js projelerinizde olaylar\u0131 ustal\u0131kla y\u00f6netebilir ve kullan\u0131c\u0131lar\u0131n\u0131z\u0131n sevece\u011fi etkile\u015fimli uygulamalar geli\u015ftirebilirsiniz. Unutmay\u0131n, iyi tasarlanm\u0131\u015f bir olay ak\u0131\u015f\u0131, uygulaman\u0131z\u0131n kalbindeki kullan\u0131c\u0131 deneyimini do\u011frudan etkiler.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Vue.js ile Olaylar\u0131 Y\u00f6netme: Etkile\u015fimli Uygulamalar Geli\u015ftirmenin Anahtar\u0131\nGiri\u015f\nModern web uygulamalar\u0131, kullan\u0131c\u0131larla s\u00fcrekli etkile\u015fi","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-30778","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>Vue.js ile Olaylar\u0131 Y\u00f6netme: Etkile\u015fimli Uygulamalar Geli\u015ftirmenin Anahtar\u0131 - 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\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vue.js ile Olaylar\u0131 Y\u00f6netme: Etkile\u015fimli Uygulamalar Geli\u015ftirmenin Anahtar\u0131\" \/>\n<meta property=\"og:description\" content=\"Vue.js ile Olaylar\u0131 Y\u00f6netme: Etkile\u015fimli Uygulamalar Geli\u015ftirmenin Anahtar\u0131 Giri\u015f Modern web uygulamalar\u0131, kullan\u0131c\u0131larla s\u00fcrekli etkile\u015fi\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-01T22:41:05+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=\"12 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Vue.js ile Olaylar\u0131 Y\u00f6netme: Etkile\u015fimli Uygulamalar Geli\u015ftirmenin Anahtar\u0131\",\"datePublished\":\"2025-10-01T22:41:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/\"},\"wordCount\":2247,\"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\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/\",\"name\":\"Vue.js ile Olaylar\u0131 Y\u00f6netme: Etkile\u015fimli Uygulamalar Geli\u015ftirmenin Anahtar\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-01T22:41:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vue.js ile Olaylar\u0131 Y\u00f6netme: Etkile\u015fimli Uygulamalar Geli\u015ftirmenin Anahtar\u0131\"}]},{\"@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":"Vue.js ile Olaylar\u0131 Y\u00f6netme: Etkile\u015fimli Uygulamalar Geli\u015ftirmenin Anahtar\u0131 - 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\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/","og_locale":"tr_TR","og_type":"article","og_title":"Vue.js ile Olaylar\u0131 Y\u00f6netme: Etkile\u015fimli Uygulamalar Geli\u015ftirmenin Anahtar\u0131","og_description":"Vue.js ile Olaylar\u0131 Y\u00f6netme: Etkile\u015fimli Uygulamalar Geli\u015ftirmenin Anahtar\u0131 Giri\u015f Modern web uygulamalar\u0131, kullan\u0131c\u0131larla s\u00fcrekli etkile\u015fi","og_url":"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-01T22:41:05+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"12 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Vue.js ile Olaylar\u0131 Y\u00f6netme: Etkile\u015fimli Uygulamalar Geli\u015ftirmenin Anahtar\u0131","datePublished":"2025-10-01T22:41:05+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/"},"wordCount":2247,"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\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/","url":"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/","name":"Vue.js ile Olaylar\u0131 Y\u00f6netme: Etkile\u015fimli Uygulamalar Geli\u015ftirmenin Anahtar\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-01T22:41:05+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-ile-olaylari-yonetme-etkilesimli-uygulamalar-gelistirmenin-anahtari\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Vue.js ile Olaylar\u0131 Y\u00f6netme: Etkile\u015fimli Uygulamalar Geli\u015ftirmenin Anahtar\u0131"}]},{"@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\/30778","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=30778"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30778\/revisions"}],"predecessor-version":[{"id":30779,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30778\/revisions\/30779"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=30778"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=30778"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=30778"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}