{"id":37245,"date":"2025-12-29T11:40:55","date_gmt":"2025-12-29T08:40:55","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=37245"},"modified":"2025-12-29T11:40:55","modified_gmt":"2025-12-29T08:40:55","slug":"vue-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/vue-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/","title":{"rendered":"Vue.js&#8217;te Etkinlikler ile Kullan\u0131c\u0131 Etkile\u015fimleri Olu\u015fturma Rehberi"},"content":{"rendered":"<p><body><\/p>\n<h2>Vue.js&#8217;te Etkinlikler ile Kullan\u0131c\u0131 Etkile\u015fimleri Olu\u015fturma Rehberi<\/h2>\n<p>Modern web uygulamalar\u0131, kullan\u0131c\u0131larla dinamik ve sezgisel bir \u015fekilde etkile\u015fim kurma yetene\u011fi \u00fczerine kuruludur. Bir butona t\u0131klamak, bir form g\u00f6ndermek, bir \u00f6\u011feyi s\u00fcr\u00fcklemek veya bir metin kutusuna yaz\u0131 yazmak gibi eylemler, kullan\u0131c\u0131 deneyiminin temel ta\u015flar\u0131d\u0131r. Vue.js, reaktif do\u011fas\u0131 ve bile\u015fen tabanl\u0131 mimarisi sayesinde, bu t\u00fcr kullan\u0131c\u0131 etkile\u015fimlerini y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir sistem sunar. Bu makale, Vue.js&#8217;te etkinliklerin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, temelden ileri seviyeye kadar farkl\u0131 senaryolarda nas\u0131l kullan\u0131labilece\u011fini ve en iyi uygulamalar\u0131 derinlemesine inceleyecektir.<\/p>\n<h3>Giri\u015f: Neden Etkinlik Y\u00f6netimi \u00d6nemlidir?<\/h3>\n<p>Kullan\u0131c\u0131 etkile\u015fimleri, bir uygulaman\u0131n sadece statik bir bilgi g\u00f6stericisi olmaktan \u00e7\u0131k\u0131p, dinamik ve canl\u0131 bir deneyim sunmas\u0131n\u0131 sa\u011flar. Etkile\u015fim olmadan, web siteleri sadece pasif sayfalardan ibaret kal\u0131r. Vue.js gibi modern JavaScript \u00e7er\u00e7eveleri, DOM (Belge Nesne Modeli) olaylar\u0131n\u0131 soyutlayarak ve daha y\u00f6netilebilir bir aray\u00fcz sunarak bu etkile\u015fimleri basitle\u015ftirir. Vue&#8217;nun etkinlik sistemi, bile\u015fenler aras\u0131nda ileti\u015fimi sa\u011flaman\u0131n, kullan\u0131c\u0131 girdisine tepki vermenin ve uygulaman\u0131z\u0131n durumunu g\u00fcncel tutman\u0131n anahtar\u0131d\u0131r.<\/p>\n<p>Bu rehberde, Vue&#8217;nun temel etkinlik dinleme mekanizmas\u0131ndan ba\u015flayarak, etkinlik de\u011fi\u015ftiricilerle davran\u0131\u015flar\u0131 nas\u0131l \u00f6zelle\u015ftirebilece\u011finizi, \u00f6zel etkinliklerle bile\u015fenler aras\u0131 ileti\u015fimi nas\u0131l kurabilece\u011finizi ve son olarak ileri d\u00fczey etkinlik senaryolar\u0131n\u0131 ve en iyi uygulamalar\u0131 ke\u015ffedece\u011fiz. Amac\u0131m\u0131z, Vue.js ile etkile\u015fimli ve kullan\u0131c\u0131 dostu uygulamalar geli\u015ftirmek i\u00e7in size kapsaml\u0131 bir bilgi birikimi sunmakt\u0131r.<\/p>\n<h3>Temel Etkinlik Y\u00f6netimi: v-on Direktifi<\/h3>\n<p>Vue.js&#8217;te etkinlik dinlemek i\u00e7in ana ara\u00e7 <code>v-on<\/code> direktifidir. Bu direktif, DOM etkinliklerini dinlemenizi ve bir olay tetiklendi\u011finde JavaScript kodunu \u00e7al\u0131\u015ft\u0131rman\u0131z\u0131 sa\u011flar.<\/p>\n<h4>v-on Direktifi ve K\u0131saltmas\u0131<\/h4>\n<p><code>v-on<\/code> direktifi, bir HTML \u00f6\u011fesi \u00fczerinde belirli bir DOM etkinli\u011fini (\u00f6rne\u011fin <code>click<\/code>, <code>submit<\/code>, <code>input<\/code>, <code>keydown<\/code>) dinlemek i\u00e7in kullan\u0131l\u0131r. S\u00f6zdizimi <code>v-on:event-name=\"handler\"<\/code> \u015feklindedir. Vue, geli\u015ftirme kolayl\u0131\u011f\u0131 i\u00e7in <code>@<\/code> sembol\u00fcn\u00fc <code>v-on:<\/code> i\u00e7in bir k\u0131saltma olarak sunar. Bu, kodunuzu daha k\u0131sa ve okunabilir hale getirir.<\/p>\n<p>\u00d6rne\u011fin, bir butona t\u0131kland\u0131\u011f\u0131nda bir fonksiyonu \u00e7a\u011f\u0131rmak i\u00e7in:<\/p>\n<pre><code>\n<template>\n  <button v-on:click=\"handleClick\">T\u0131kla Bana<\/button>\n  <!-- K\u0131saltma ile ayn\u0131 i\u015flevi g\u00f6r\u00fcr -->\n  <button @click=\"handleClick\">T\u0131kla Bana (K\u0131saltma)<\/button>\n<\/template>\n\n<script setup>\nimport { ref } from 'vue';\n\nconst message = ref('Merhaba Vue!');\n\nconst handleClick = () => {\n  alert(message.value);\n};\n<\/script>\n<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>handleClick<\/code> metodu, buton t\u0131kland\u0131\u011f\u0131nda tetiklenir ve bir uyar\u0131 mesaj\u0131 g\u00f6sterir.<\/p>\n<h4>Y\u00f6ntem \u0130\u015fleyicileri (Method Handlers)<\/h4>\n<p>\u00c7o\u011fu durumda, etkinlik i\u015fleyicisi olarak bir y\u00f6ntem (method) kullanmak en iyi uygulamad\u0131r. Y\u00f6ntem i\u015fleyicileri, bile\u015feninizin <code>methods<\/code> se\u00e7ene\u011finde (Options API) veya <code>script setup<\/code> blo\u011funda tan\u0131mlanan fonksiyonlard\u0131r (Composition API). Bu yakla\u015f\u0131m, mant\u0131\u011f\u0131 \u015fablondan ay\u0131rarak kodunuzu daha d\u00fczenli ve bak\u0131m\u0131 kolay hale getirir.<\/p>\n<p>Bir y\u00f6ntemi etkinlik i\u015fleyicisi olarak kulland\u0131\u011f\u0131n\u0131zda, Vue olay\u0131 (event object) otomatik olarak y\u00f6ntemin ilk arg\u00fcman\u0131 olarak ge\u00e7irir.<\/p>\n<pre><code>\n<template>\n  <button @click=\"sayHello\">Selam Ver<\/button>\n  <button @click=\"greet('D\u00fcnya')\">Selam Ver (Arg\u00fcmanl\u0131)<\/button>\n<\/template>\n\n<script setup>\nconst sayHello = (event) => {\n  \/\/ event objesine eri\u015filebilir\n  console.log('Selam!', event.target.tagName);\n};\n\nconst greet = (name, event) => {\n  \/\/ Arg\u00fcmanlar \u00f6nce gelir, event objesi en sonda\n  console.log(<code>Merhaba, ${name}!<\/code>, event);\n};\n<\/script>\n<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte, <code>sayHello<\/code> metodu sadece olay\u0131 al\u0131r. <code>greet<\/code> metodu ise \u00f6zel bir arg\u00fcman (<code>name<\/code>) al\u0131r ve olay objesi otomatik olarak ikinci arg\u00fcman olarak eklenir. E\u011fer sadece \u00f6zel arg\u00fcmanlar ge\u00e7irmek istiyorsan\u0131z ve olay objesine ihtiyac\u0131n\u0131z yoksa, <code>greet('D\u00fcnya')<\/code> \u015feklinde do\u011frudan \u00e7a\u011fr\u0131 yapabilirsiniz. Olay objesine ihtiyac\u0131n\u0131z varsa, <code>$event<\/code> \u00f6zel anahtar kelimesini kullanabilirsiniz: <code>@click=\"greet('D\u00fcnya', $event)\"<\/code>.<\/p>\n<h4>Sat\u0131r \u0130\u00e7i \u0130fadeler (Inline Statements)<\/h4>\n<p>Basit mant\u0131klar i\u00e7in, do\u011frudan \u015fablon i\u00e7inde bir JavaScript ifadesi kullanabilirsiniz. Bu, \u00f6zellikle \u00e7ok k\u0131sa ve tek kullan\u0131ml\u0131k mant\u0131klar i\u00e7in uygundur.<\/p>\n<pre><code>\n<template>\n  <p>Saya\u00e7: {{ counter }}<\/p>\n  <button @click=\"counter++\">Artt\u0131r<\/button>\n  <button @click=\"showMessage = !showMessage\">Mesaj\u0131 G\u00f6ster\/Gizle<\/button>\n  <p v-if=\"showMessage\">Bu bir mesajd\u0131r.<\/p>\n<\/template>\n\n<script setup>\nimport { ref } from 'vue';\n\nconst counter = ref(0);\nconst showMessage = ref(false);\n<\/script>\n<\/code><\/pre>\n<p>Bu yakla\u015f\u0131m, kodun okunabilirli\u011fini azaltabilece\u011fi i\u00e7in karma\u015f\u0131k mant\u0131klar i\u00e7in \u00f6nerilmez. Genellikle, bir y\u00f6ntemi \u00e7a\u011f\u0131rmak daha iyi bir uygulamad\u0131r.<\/p>\n<h3>Etkinlik De\u011fi\u015ftiriciler (Event Modifiers)<\/h3>\n<p>Vue.js, DOM etkinliklerinin varsay\u0131lan davran\u0131\u015flar\u0131n\u0131 veya yay\u0131lma \u015fekillerini kolayca de\u011fi\u015ftirmek i\u00e7in etkinlik de\u011fi\u015ftiricileri sunar. Bu de\u011fi\u015ftiriciler, <code>v-on<\/code> veya <code>@<\/code> direktifine bir nokta (<code>.<\/code>) ile eklenir ve genellikle DOM API&#8217;sinde manuel olarak <code>event.preventDefault()<\/code> veya <code>event.stopPropagation()<\/code> \u00e7a\u011f\u0131rmak yerine daha temiz bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<h4>Yayg\u0131n Etkinlik De\u011fi\u015ftiriciler<\/h4>\n<p>*   <strong><code>.stop<\/code><\/strong>: <code>event.stopPropagation()<\/code> \u00e7a\u011f\u0131r\u0131r. Etkinli\u011fin \u00fcst \u00f6\u011felere yay\u0131lmas\u0131n\u0131 engeller.<\/p>\n<pre><code><div @click=\"handleParentClick\">\n      <button @click.stop=\"handleChildClick\">T\u0131kla<\/button>\n    <\/div><\/code><\/pre>\n<p>    Bu durumda, butona t\u0131kland\u0131\u011f\u0131nda sadece <code>handleChildClick<\/code> tetiklenir, <code>handleParentClick<\/code> tetiklenmez.<br \/>\n*   <strong><code>.prevent<\/code><\/strong>: <code>event.preventDefault()<\/code> \u00e7a\u011f\u0131r\u0131r. Etkinli\u011fin varsay\u0131lan davran\u0131\u015f\u0131n\u0131 engeller. \u00d6zellikle form g\u00f6nderimlerinde veya ba\u011flant\u0131 t\u0131klamalar\u0131nda sayfan\u0131n yeniden y\u00fcklenmesini \u00f6nlemek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code><form @submit.prevent=\"handleSubmit\">\n      <input type=\"text\">\n      <button type=\"submit\">G\u00f6nder<\/button>\n    <\/form><\/code><\/pre>\n<p>    Bu form g\u00f6nderildi\u011finde sayfa yeniden y\u00fcklenmeyecek, sadece <code>handleSubmit<\/code> metodu \u00e7al\u0131\u015facakt\u0131r.<br \/>\n*   <strong><code>.capture<\/code><\/strong>: Olay dinleyicisini yakalama (capture) a\u015famas\u0131nda ekler. Normalde, olaylar kabarc\u0131klanma (bubbling) a\u015famas\u0131nda dinlenir.<\/p>\n<pre><code><div @click.capture=\"handleCaptureClick\">\n      <button @click=\"handleBubbleClick\">T\u0131kla<\/button>\n    <\/div><\/code><\/pre>\n<p>    Butona t\u0131kland\u0131\u011f\u0131nda, <code>handleCaptureClick<\/code> \u00f6nce, <code>handleBubbleClick<\/code> sonra tetiklenir.<br \/>\n*   <strong><code>.self<\/code><\/strong>: Sadece etkinli\u011fin do\u011frudan eleman\u0131n kendisi taraf\u0131ndan tetiklenmesi durumunda i\u015fleyiciyi \u00e7al\u0131\u015ft\u0131r\u0131r (yani <code>event.target<\/code> eleman\u0131n kendisi oldu\u011funda).<\/p>\n<pre><code><div @click.self=\"handleSelfClick\">\n      <button>\u0130\u00e7 Buton<\/button>\n    <\/div><\/code><\/pre>\n<p>    Burada, <code>div<\/code>&#8216;e t\u0131kland\u0131\u011f\u0131nda <code>handleSelfClick<\/code> \u00e7al\u0131\u015f\u0131r, ancak i\u00e7 butona t\u0131kland\u0131\u011f\u0131nda <code>handleSelfClick<\/code> \u00e7al\u0131\u015fmaz \u00e7\u00fcnk\u00fc <code>event.target<\/code> butonun kendisidir.<br \/>\n*   <strong><code>.once<\/code><\/strong>: Olay i\u015fleyicisinin sadece bir kez tetiklenmesini sa\u011flar.<\/p>\n<pre><code><button @click.once=\"doSomethingOnce\">Bir Kez T\u0131kla<\/button><\/code><\/pre>\n<p>*   <strong><code>.passive<\/code><\/strong>: \u00d6zellikle dokunma (<code>touchstart<\/code>, <code>touchmove<\/code>) ve kayd\u0131rma (<code>scroll<\/code>) etkinlikleri i\u00e7in performans\u0131 art\u0131r\u0131r. <code>preventDefault()<\/code> \u00e7a\u011fr\u0131s\u0131n\u0131 yapmayaca\u011f\u0131n\u0131z\u0131 Vue&#8217;ya bildirir, bu da taray\u0131c\u0131n\u0131n kayd\u0131rma optimizasyonlar\u0131n\u0131 daha erken yapmas\u0131na olanak tan\u0131r.<\/p>\n<pre><code><div @scroll.passive=\"handleScroll\">...<\/div><\/code><\/pre>\n<h4>Tu\u015f ve Sistem De\u011fi\u015ftiriciler<\/h4>\n<p>Vue, klavye etkinliklerini (<code>keydown<\/code>, <code>keyup<\/code>) dinlerken belirli tu\u015flara tepki vermek i\u00e7in tu\u015f de\u011fi\u015ftiricileri sunar.<\/p>\n<p>*   <strong>Tu\u015f Kodlar\u0131<\/strong>: <code>.enter<\/code>, <code>.tab<\/code>, <code>.delete<\/code> (hem &#8220;Delete&#8221; hem de &#8220;Backspace&#8221;), <code>.esc<\/code>, <code>.space<\/code>, <code>.up<\/code>, <code>.down<\/code>, <code>.left<\/code>, <code>.right<\/code>.<\/p>\n<pre><code><input @keyup.enter=\"submitForm\"><\/code><\/pre>\n<p>    Bu input alan\u0131nda Enter tu\u015funa bas\u0131ld\u0131\u011f\u0131nda <code>submitForm<\/code> metodu \u00e7al\u0131\u015f\u0131r.<br \/>\n*   <strong>Sistem Tu\u015flar\u0131<\/strong>: <code>.ctrl<\/code>, <code>.alt<\/code>, <code>.shift<\/code>, <code>.meta<\/code> (Windows&#8217;ta Win tu\u015fu, Mac&#8217;te Command tu\u015fu).<\/p>\n<pre><code><div @click.ctrl=\"handleCtrlClick\">Ctrl ile T\u0131kla<\/div><\/code><\/pre>\n<p>    Bu div&#8217;e Ctrl tu\u015fu bas\u0131l\u0131yken t\u0131kland\u0131\u011f\u0131nda <code>handleCtrlClick<\/code> tetiklenir.<br \/>\n*   <strong>Tam E\u015fle\u015fme<\/strong>: <code>.exact<\/code> de\u011fi\u015ftiricisi, di\u011fer sistem tu\u015flar\u0131n\u0131n bas\u0131l\u0131 olmamas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code><button @click.ctrl.exact=\"doSomething\">Sadece Ctrl ile<\/button>\n    <button @click.shift.exact=\"doSomethingElse\">Sadece Shift ile<\/button><\/code><\/pre>\n<p>    \u0130lk butona Ctrl ve Shift ayn\u0131 anda bas\u0131l\u0131yken t\u0131klarsan\u0131z <code>doSomething<\/code> \u00e7al\u0131\u015fmaz.<\/p>\n<p>Birden fazla de\u011fi\u015ftiriciyi zincirleme \u015fekilde kullanabilirsiniz: <code>@click.prevent.stop=\"doThis\"<\/code>. De\u011fi\u015ftiricilerin s\u0131ras\u0131 \u00f6nemlidir; \u00f6rne\u011fin, <code>@click.prevent.self<\/code> ile <code>@click.self.prevent<\/code> farkl\u0131 davran\u0131\u015flara yol a\u00e7abilir. Genellikle, <code>self<\/code> gibi k\u0131s\u0131tlay\u0131c\u0131 de\u011fi\u015ftiriciler en sona b\u0131rak\u0131l\u0131r.<\/p>\n<h3>\u00d6zel Etkinlikler ve Bile\u015fen \u0130leti\u015fimi<\/h3>\n<p>Vue&#8217;nun en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biri, bile\u015fenler aras\u0131 ileti\u015fimi kolayla\u015ft\u0131ran \u00f6zel etkinlik sistemidir. Bu, \u00f6zellikle alt bile\u015fenlerden \u00fcst bile\u015fenlere veri g\u00f6ndermek veya bir olay\u0131n ger\u00e7ekle\u015fti\u011fini bildirmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h4>Neden \u00d6zel Etkinlikler?<\/h4>\n<p>Vue&#8217;da bile\u015fenler aras\u0131 ileti\u015fim genellikle &#8220;props down, events up&#8221; (\u00f6zellikler a\u015fa\u011f\u0131, etkinlikler yukar\u0131) prensibine dayan\u0131r. \u00dcst bile\u015fenler, alt bile\u015fenlere \u00f6zellikler (props) arac\u0131l\u0131\u011f\u0131yla veri g\u00f6nderir. Alt bile\u015fenler ise, \u00fcst bile\u015fenlere bir \u015fey oldu\u011funu veya bir verinin de\u011fi\u015fti\u011fini bildirmek i\u00e7in \u00f6zel etkinlikler (<code>custom events<\/code>) yayar. Bu, bile\u015fenlerin birbirinden ba\u011f\u0131ms\u0131z kalmas\u0131n\u0131 (decoupled) ve daha kolay yeniden kullan\u0131labilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4><code>$emit<\/code> Kullan\u0131m\u0131<\/h4>\n<p>Bir alt bile\u015fen, <code>this.$emit()<\/code> (Options API) veya <code>emit()<\/code> fonksiyonunu (Composition API) kullanarak bir \u00f6zel etkinlik yayabilir. Bu etkinlik, \u00fcst bile\u015fen taraf\u0131ndan <code>@<\/code> direktifi ile dinlenebilir.<\/p>\n<p><strong>\u00d6rnek: Alt bile\u015fenden \u00fcst bile\u015fene veri g\u00f6nderme<\/strong><\/p>\n<pre><code class=\"language-vue\"><!-- ChildComponent.vue -->\n<template>\n  <button @click=\"emitData\">Veri G\u00f6nder<\/button>\n  <button @click=\"emitEventWithoutData\">Sadece Olay\u0131 Bildir<\/button>\n<\/template>\n\n<script setup>\nimport { ref } from 'vue';\n\n\/\/ emit fonksiyonunu tan\u0131mla\nconst emit = defineEmits(['dataEmitted', 'eventTriggered']);\n\nconst someData = ref('Merhaba \u00dcst Bile\u015fen!');\n\nconst emitData = () => {\n  emit('dataEmitted', someData.value); \/\/ Etkinlik ad\u0131 ve g\u00f6nderilecek veri\n};\n\nconst emitEventWithoutData = () => {\n  emit('eventTriggered'); \/\/ Sadece etkinlik ad\u0131\n};\n<\/script><\/code><\/pre>\n<pre><code class=\"language-vue\"><!-- ParentComponent.vue -->\n<template>\n  <ChildComponent @dataEmitted=\"handleData\" @eventTriggered=\"handleEvent\" \/>\n  <p v-if=\"receivedData\">Al\u0131nan Veri: {{ receivedData }}<\/p>\n  <p v-if=\"eventCount > 0\">Olay Say\u0131s\u0131: {{ eventCount }}<\/p>\n<\/template>\n\n<script setup>\nimport { ref } from 'vue';\nimport ChildComponent from '.\/ChildComponent.vue';\n\nconst receivedData = ref('');\nconst eventCount = ref(0);\n\nconst handleData = (data) => {\n  receivedData.value = data;\n  console.log('\u00dcst bile\u015fen veri ald\u0131:', data);\n};\n\nconst handleEvent = () => {\n  eventCount.value++;\n  console.log('\u00dcst bile\u015fen olay\u0131 dinledi.');\n};\n<\/script><\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>ChildComponent<\/code>, <code>dataEmitted<\/code> ve <code>eventTriggered<\/code> ad\u0131nda iki \u00f6zel etkinlik yayar. <code>ParentComponent<\/code> bu etkinlikleri dinler ve <code>handleData<\/code> veya <code>handleEvent<\/code> metotlar\u0131n\u0131 \u00e7a\u011f\u0131rarak tepki verir. <code>dataEmitted<\/code> etkinli\u011fiyle birlikte <code>someData.value<\/code> de\u011feri de \u00fcst bile\u015fene iletilir.<\/p>\n<h4><code>defineEmits<\/code> (Composition API)<\/h4>\n<p>Composition API&#8217;de, <code>script setup<\/code> i\u00e7inde <code>defineEmits<\/code> makrosunu kullanarak bir bile\u015fenin yayabilece\u011fi etkinlikleri a\u00e7\u0131k\u00e7a tan\u0131mlars\u0131n\u0131z. Bu, IDE&#8217;lere ve TypeScript&#8217;e, bile\u015feninizin hangi etkinlikleri yayd\u0131\u011f\u0131n\u0131 bildirerek daha iyi otomatik tamamlama ve tip g\u00fcvenli\u011fi sa\u011flar.<\/p>\n<pre><code class=\"language-js\">\/\/ ChildComponent.vue i\u00e7indeki defineEmits kullan\u0131m\u0131\nconst emit = defineEmits(['dataEmitted', 'eventTriggered', 'update:modelValue']);<\/code><\/pre>\n<h4>Etkinlik Do\u011frulama (Event Validation)<\/h4>\n<p><code>defineEmits<\/code> ile etkinlikleri tan\u0131mlarken, yay\u0131lan etkinliklerin ta\u015f\u0131d\u0131\u011f\u0131 veriyi do\u011frulamak i\u00e7in bir do\u011frulay\u0131c\u0131 fonksiyon da sa\u011flayabilirsiniz. Bu, \u00f6zellikle b\u00fcy\u00fck uygulamalarda veya k\u00fct\u00fcphane geli\u015ftirirken hata ay\u0131klamay\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<pre><code class=\"language-js\">\/\/ ChildComponent.vue i\u00e7inde etkinlik do\u011frulama\nconst emit = defineEmits({\n  dataEmitted: (payload) => {\n    \/\/ payload'\u0131n string olup olmad\u0131\u011f\u0131n\u0131 kontrol et\n    if (typeof payload === 'string') {\n      return true;\n    } else {\n      console.warn('dataEmitted etkinli\u011fi ge\u00e7ersiz y\u00fck ile yay\u0131ld\u0131:', payload);\n      return false;\n    }\n  },\n  eventTriggered: null \/\/ Do\u011frulama yok\n});<\/code><\/pre>\n<p>E\u011fer do\u011frulay\u0131c\u0131 fonksiyon <code>false<\/code> d\u00f6nerse, Vue bir uyar\u0131 mesaj\u0131 yay\u0131nlar.<\/p>\n<h3>Model Etkinlikleri (<code>v-model<\/code> ile Etkinlikler)<\/h3>\n<p><code>v-model<\/code> direktifi, form giri\u015f elemanlar\u0131 \u00fczerinde iki y\u00f6nl\u00fc veri ba\u011flamay\u0131 kolayla\u015ft\u0131ran \u00f6zel bir Vue \u00f6zelli\u011fidir. Temel olarak, bir <code><input><\/code> \u00fczerinde <code>:value<\/code> prop&#8217;unu ve <code>@input<\/code> etkinli\u011fini bir araya getiren bir k\u0131saltmad\u0131r. Ancak, <code>v-model<\/code>&#8216;i kendi \u00f6zel bile\u015fenlerinizde de kullanarak daha karma\u015f\u0131k form kontrolleri olu\u015fturabilirsiniz.<\/p>\n<h4><code>v-model<\/code>&#8216;in \u00d6zel Bile\u015fenlerde Kullan\u0131m\u0131<\/h4>\n<p>Bir \u00f6zel bile\u015fende <code>v-model<\/code> kullanmak i\u00e7in, bile\u015fenin <code>modelValue<\/code> ad\u0131nda bir prop kabul etmesi ve <code>update:modelValue<\/code> ad\u0131nda bir etkinlik yaymas\u0131 gerekir.<\/p>\n<p><strong>\u00d6rnek: \u00d6zel bir metin giri\u015fi bile\u015feni<\/strong><\/p>\n<pre><code class=\"language-vue\"><!-- CustomInput.vue -->\n<template>\n  <input\n    :value=\"modelValue\"\n    @input=\"$emit('update:modelValue', $event.target.value)\"\n    type=\"text\"\n  \/>\n<\/template>\n\n<script setup>\nimport { defineProps, defineEmits } from 'vue';\n\n\/\/ modelValue prop'unu tan\u0131mla\ndefineProps({\n  modelValue: String\n});\n\n\/\/ update:modelValue etkinli\u011fini tan\u0131mla\nconst emit = defineEmits(['update:modelValue']);\n<\/script><\/code><\/pre>\n<pre><code class=\"language-vue\"><!-- ParentComponent.vue -->\n<template>\n  <CustomInput v-model=\"searchText\" \/>\n  <p>Aranan Metin: {{ searchText }}<\/p>\n<\/template>\n\n<script setup>\nimport { ref } from 'vue';\nimport CustomInput from '.\/CustomInput.vue';\n\nconst searchText = ref('');\n<\/script><\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>CustomInput<\/code> bile\u015feni <code>modelValue<\/code> prop&#8217;unu al\u0131r ve <code>input<\/code> etkinli\u011fi her tetiklendi\u011finde <code>update:modelValue<\/code> etkinli\u011fini yayar. <code>ParentComponent<\/code> ise <code>v-model=\"searchText\"<\/code> kullanarak bu bile\u015feni iki y\u00f6nl\u00fc olarak <code>searchText<\/code> verisine ba\u011flar.<\/p>\n<h4>Birden Fazla <code>v-model<\/code> Ba\u011flama<\/h4>\n<p>Vue 3 ile birlikte, bir bile\u015fende birden fazla <code>v-model<\/code> ba\u011flama yetene\u011fi eklendi. Bu, bile\u015fenin farkl\u0131 \u00f6zelliklerini ayr\u0131 ayr\u0131 iki y\u00f6nl\u00fc ba\u011flaman\u0131za olanak tan\u0131r. Her bir <code>v-model<\/code> i\u00e7in <code>:propName<\/code> ve <code>@update:propName<\/code> kal\u0131b\u0131n\u0131 kullan\u0131rs\u0131n\u0131z.<\/p>\n<pre><code class=\"language-vue\"><!-- MultiVModelComponent.vue -->\n<template>\n  &lt;label&gt;Ad:&lt;\/label&gt;\n  &lt;input\n    :value=\"firstName\"\n    @input=\"$emit('update:firstName', $event.target.value)\"\n    type=\"text\"\n  \/&gt;\n  &lt;br \/&gt;\n  &lt;label&gt;Soyad:&lt;\/label&gt;\n  &lt;input\n    :value=\"lastName\"\n    @input=\"$emit('update:lastName', $event.target.value)\"\n    type=\"text\"\n  \/&gt;\n<\/template>\n\n<script setup>\nimport { defineProps, defineEmits } from 'vue';\n\ndefineProps({\n  firstName: String,\n  lastName: String\n});\n\nconst emit = defineEmits(['update:firstName', 'update:lastName']);\n<\/script><\/code><\/pre>\n<pre><code class=\"language-vue\"><!-- ParentComponent.vue -->\n<template>\n  <MultiVModelComponent v-model:firstName=\"user.first\" v-model:lastName=\"user.last\" \/>\n  &lt;p&gt;Ad: {{ user.first }}, Soyad: {{ user.last }}&lt;\/p&gt;\n<\/template>\n\n<script setup>\nimport { reactive } from 'vue';\nimport MultiVModelComponent from '.\/MultiVModelComponent.vue';\n\nconst user = reactive({\n  first: 'John',\n  last: 'Doe'\n});\n<\/script><\/code><\/pre>\n<p>Bu \u00f6zellik, daha karma\u015f\u0131k form bile\u015fenleri olu\u015ftururken veya bir bile\u015fenin birden fazla ba\u011flama noktas\u0131na sahip olmas\u0131 gerekti\u011finde olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h3>Geli\u015fmi\u015f Etkinlik Kullan\u0131m Senaryolar\u0131<\/h3>\n<p>Vue&#8217;nun etkinlik sistemi, temel kullan\u0131mlar\u0131n \u00f6tesinde, daha dinamik ve karma\u015f\u0131k etkile\u015fimler i\u00e7in de esneklik sunar.<\/p>\n<h4>Dinamik Etkinlik \u0130simleri<\/h4>\n<p>Bazen, hangi etkinli\u011fi dinleyece\u011finiz \u00e7al\u0131\u015fma zaman\u0131nda (runtime) belirlenebilir. Vue, <code>v-on:[eventName]<\/code> s\u00f6zdizimi ile dinamik etkinlik isimlerini destekler. <code>eventName<\/code> bir JavaScript ifadesi olabilir.<\/p>\n<pre><code>\n<template>\n  <button @[eventType]=\"handleDynamicEvent\">Dinamik Olay\u0131 Tetikle<\/button>\n  <select v-model=\"eventType\">\n    <option value=\"click\">Click<\/option>\n    <option value=\"mouseover\">Mouseover<\/option>\n  <\/select>\n<\/template>\n\n<script setup>\nimport { ref } from 'vue';\n\nconst eventType = ref('click');\n\nconst handleDynamicEvent = () => {\n  alert(<code>Dinamik olay tetiklendi: ${eventType.value}<\/code>);\n};\n<\/script>\n<\/code><\/pre>\n<p>Bu \u00f6rnekte, kullan\u0131c\u0131 bir <code>select<\/code> kutusundan <code>click<\/code> veya <code>mouseover<\/code> se\u00e7ti\u011finde, buton o se\u00e7ime g\u00f6re dinamik olarak ilgili olay\u0131 dinleyecektir.<\/p>\n<h4>Etkinlik Dinleyicilerini Kald\u0131rma<\/h4>\n<p>Vue, bile\u015fen ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca etkinlik dinleyicilerini otomatik olarak y\u00f6netir. Bir bile\u015fen kald\u0131r\u0131ld\u0131\u011f\u0131nda, Vue o bile\u015fenle ili\u015fkili t\u00fcm etkinlik dinleyicilerini otomatik olarak temizler. Ancak, do\u011frudan DOM API&#8217;si ile ekledi\u011finiz global etkinlik dinleyicileri (\u00f6rne\u011fin <code>window.addEventListener<\/code>) i\u00e7in manuel temizlik yapman\u0131z gerekir. Bunu <code>onMounted<\/code> ve <code>onUnmounted<\/code> ya\u015fam d\u00f6ng\u00fcs\u00fc kancalar\u0131 i\u00e7inde yapabilirsiniz.<\/p>\n<pre><code>\n<template>\n  <p>Pencere geni\u015fli\u011fi: {{ windowWidth }}<\/p>\n<\/template>\n\n<script setup>\nimport { ref, onMounted, onUnmounted } from 'vue';\n\nconst windowWidth = ref(window.innerWidth);\n\nconst updateWindowWidth = () => {\n  windowWidth.value = window.innerWidth;\n};\n\nonMounted(() => {\n  window.addEventListener('resize', updateWindowWidth);\n});\n\nonUnmounted(() => {\n  window.removeEventListener('resize', updateWindowWidth);\n});\n<\/script>\n<\/code><\/pre>\n<p>Bu, bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nlemek i\u00e7in \u00f6nemlidir.<\/p>\n<h4>S\u00fcr\u00fckle ve B\u0131rak (Drag and Drop) Etkinlikleri<\/h4>\n<p>S\u00fcr\u00fckle ve b\u0131rak i\u015flevselli\u011fi, modern aray\u00fczlerde yayg\u0131n bir etkile\u015fim t\u00fcr\u00fcd\u00fcr. Vue, HTML5 S\u00fcr\u00fckle ve B\u0131rak API&#8217;sinin etkinliklerini do\u011frudan <code>v-on<\/code> ile dinlemenizi sa\u011flar: <code>dragstart<\/code>, <code>dragover<\/code>, <code>dragleave<\/code>, <code>drop<\/code> vb.<\/p>\n<pre><code>\n<template>\n  <div\n    draggable=\"true\"\n    @dragstart=\"handleDragStart\"\n    @dragend=\"handleDragEnd\"\n    style=\"width: 100px; height: 100px; background-color: lightblue; cursor: grab;\"\n  >\n    S\u00fcr\u00fcklenebilir \u00d6\u011fe\n  <\/div>\n\n  <div\n    @dragover.prevent\n    @drop=\"handleDrop\"\n    @dragleave=\"handleDragLeave\"\n    @dragenter=\"handleDragEnter\"\n    :style=\"{ backgroundColor: isDraggingOver ? 'lightgreen' : 'lightgray' }\"\n    style=\"width: 200px; height: 200px; margin-top: 20px;\"\n  >\n    B\u0131rakma Alan\u0131\n  <\/div>\n<\/template>\n\n<script setup>\nimport { ref } from 'vue';\n\nconst isDraggingOver = ref(false);\n\nconst handleDragStart = (event) => {\n  console.log('S\u00fcr\u00fckleme ba\u015flad\u0131!', event);\n  \/\/ S\u00fcr\u00fcklenen veriyi ayarla\n  event.dataTransfer.setData('text\/plain', 'S\u00fcr\u00fcklenen Veri');\n};\n\nconst handleDragEnd = () => {\n  console.log('S\u00fcr\u00fckleme bitti.');\n};\n\nconst handleDragEnter = () => {\n  isDraggingOver.value = true;\n};\n\nconst handleDragLeave = () => {\n  isDraggingOver.value = false;\n};\n\nconst handleDrop = (event) => {\n  event.preventDefault(); \/\/ Varsay\u0131lan davran\u0131\u015f\u0131 engelle (link a\u00e7ma vb.)\n  isDraggingOver.value = false;\n  const data = event.dataTransfer.getData('text\/plain');\n  console.log('\u00d6\u011fe b\u0131rak\u0131ld\u0131! Veri:', data);\n  alert(<code>B\u0131rak\u0131lan veri: ${data}<\/code>);\n};\n<\/script>\n<\/code><\/pre>\n<p><code>@dragover.prevent<\/code> kullan\u0131m\u0131, b\u0131rakma i\u015fleminin ger\u00e7ekle\u015febilmesi i\u00e7in varsay\u0131lan davran\u0131\u015f\u0131 engellemek a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir.<\/p>\n<h3>En \u0130yi Uygulamalar ve \u0130pu\u00e7lar\u0131<\/h3>\n<p>Etkinlikleri etkili bir \u015fekilde kullanmak, sadece i\u015flevsellik sa\u011flamakla kalmaz, ayn\u0131 zamanda uygulaman\u0131z\u0131n performans\u0131n\u0131, okunabilirli\u011fini ve eri\u015filebilirli\u011fini de art\u0131r\u0131r.<\/p>\n<h4>Anlaml\u0131 Y\u00f6ntem \u0130simleri<\/h4>\n<p>Etkinlik i\u015fleyicileriniz i\u00e7in a\u00e7\u0131k ve a\u00e7\u0131klay\u0131c\u0131 isimler kullan\u0131n. <code>handleClick<\/code> yerine <code>handleFormSubmit<\/code>, <code>toggleSidebar<\/code> veya <code>confirmDeletion<\/code> gibi isimler, metodun ne yapt\u0131\u011f\u0131n\u0131 an\u0131nda anlaman\u0131z\u0131 sa\u011flar.<\/p>\n<h4>Etkinlikleri Ayr\u0131\u015ft\u0131rma<\/h4>\n<p>Etkinlik i\u015fleyicilerinizi tek bir sorumlulu\u011fa odaklay\u0131n. Karma\u015f\u0131k mant\u0131\u011f\u0131 birden fazla fonksiyona b\u00f6lmek, kodunuzu daha test edilebilir ve bak\u0131m\u0131 kolay hale getirir. Bir etkinlik i\u015fleyicisi, genellikle di\u011fer fonksiyonlar\u0131 \u00e7a\u011f\u0131rarak ana ak\u0131\u015f\u0131 y\u00f6netmelidir.<\/p>\n<h4>Performans: Debounce ve Throttle<\/h4>\n<p><code>input<\/code>, <code>scroll<\/code>, <code>resize<\/code>, <code>mousemove<\/code> gibi s\u0131k tetiklenen etkinlikler performans sorunlar\u0131na yol a\u00e7abilir. Bu t\u00fcr durumlarda, <code>debounce<\/code> (bir s\u00fcre i\u00e7inde tekrar tetiklenirse \u00f6nceki \u00e7a\u011fr\u0131y\u0131 iptal edip yeni \u00e7a\u011fr\u0131y\u0131 bekler) veya <code>throttle<\/code> (belirli bir zaman aral\u0131\u011f\u0131nda sadece bir kez tetiklenir) tekniklerini kullanarak etkinlik i\u015fleyicilerinin \u00e7al\u0131\u015fma s\u0131kl\u0131\u011f\u0131n\u0131 s\u0131n\u0131rlayabilirsiniz. Lodash gibi k\u00fct\u00fcphaneler bu yard\u0131mc\u0131 fonksiyonlar\u0131 sa\u011flar.<\/p>\n<pre><code>\n<template>\n  <input type=\"text\" @input=\"handleSearchInput\" placeholder=\"Ara...\">\n<\/template>\n\n<script setup>\nimport { ref, onMounted, onUnmounted } from 'vue';\nimport { debounce } from 'lodash'; \/\/ lodash k\u00fct\u00fcphanesinden debounce\n\nconst searchTerm = ref('');\n\n\/\/ Debounce uygulanm\u0131\u015f arama fonksiyonu\nconst debouncedSearch = debounce((value) => {\n  searchTerm.value = value;\n  console.log('Arama yap\u0131l\u0131yor:', value);\n  \/\/ Ger\u00e7ek arama API \u00e7a\u011fr\u0131s\u0131 burada yap\u0131labilir\n}, 500); \/\/ 500ms bekleme s\u00fcresi\n\nconst handleSearchInput = (event) => {\n  debouncedSearch(event.target.value);\n};\n\n\/\/ Bile\u015fen kald\u0131r\u0131ld\u0131\u011f\u0131nda debounce fonksiyonunu temizle\nonUnmounted(() => {\n  debouncedSearch.cancel();\n});\n<\/script>\n<\/code><\/pre>\n<h4>Eri\u015filebilirlik (Accessibility)<\/h4>\n<p>Web uygulamalar\u0131n\u0131z\u0131n herkes taraf\u0131ndan kullan\u0131labilir oldu\u011fundan emin olun.<br \/>\n*   <strong>Klavye Navigasyonu<\/strong>: Sadece fare t\u0131klamalar\u0131yla de\u011fil, klavye ile de etkile\u015fim kurabilen \u00f6\u011feler sa\u011flay\u0131n. \u00d6rne\u011fin, bir butona t\u0131klamak i\u00e7in <code>@click<\/code> kullan\u0131yorsan\u0131z, ayn\u0131 i\u015flevi <code>Enter<\/code> veya <code>Space<\/code> tu\u015flar\u0131yla da tetikleyebilmelisiniz (<code>@keyup.enter<\/code>, <code>@keyup.space<\/code>).<br \/>\n*   <strong>ARIA Nitelikleri<\/strong>: Etkile\u015fimli \u00f6\u011feler i\u00e7in uygun ARIA (Accessible Rich Internet Applications) niteliklerini kullan\u0131n (\u00f6rne\u011fin, <code>aria-label<\/code>, <code>aria-expanded<\/code>).<br \/>\n*   <strong>Odak Y\u00f6netimi<\/strong>: Dinamik i\u00e7erik de\u011fi\u015fikliklerinde veya modal pencerelerde oda\u011f\u0131n do\u011fru yere ta\u015f\u0131nmas\u0131n\u0131 sa\u011flay\u0131n.<\/p>\n<h4>Kod Okunabilirli\u011fi<\/h4>\n<p>*   <code>v-on<\/code> i\u00e7in <code>@<\/code> k\u0131saltmas\u0131n\u0131 kullan\u0131n.<br \/>\n*   \u0130lgili de\u011fi\u015ftiricileri zincirleme \u015fekilde kullan\u0131n.<br \/>\n*   Karma\u015f\u0131k sat\u0131r i\u00e7i ifadelerden ka\u00e7\u0131n\u0131n; bunlar\u0131 y\u00f6ntemlere ta\u015f\u0131y\u0131n.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Vue.js&#8217;in etkinlik sistemi, etkile\u015fimli ve dinamik web uygulamalar\u0131 olu\u015fturman\u0131n temelidir. Temel etkinlik dinleyicilerinden, etkinlik de\u011fi\u015ftiricilere, \u00f6zel bile\u015fen etkinliklerine ve <code>v-model<\/code> ile iki y\u00f6nl\u00fc ba\u011flamaya kadar Vue, geli\u015ftiricilere g\u00fc\u00e7l\u00fc ve esnek ara\u00e7lar sunar. Bu makalede ele ald\u0131\u011f\u0131m\u0131z konular, kullan\u0131c\u0131 etkile\u015fimlerini verimli ve s\u00fcrd\u00fcr\u00fclebilir bir \u015fekilde y\u00f6netmek i\u00e7in gerekli bilgi birikimini sa\u011flamaktad\u0131r.<\/p>\n<p>Etkinlikleri do\u011fru bir \u015fekilde kullanarak, sadece uygulaman\u0131z\u0131n i\u015flevselli\u011fini art\u0131rmakla kalmaz, ayn\u0131 zamanda kullan\u0131c\u0131 deneyimini zenginle\u015ftirir ve daha eri\u015filebilir, performansl\u0131 ve bak\u0131m\u0131 kolay bir kod taban\u0131 olu\u015fturursunuz. Vue.js ile etkinliklerin g\u00fcc\u00fcn\u00fc ke\u015ffetmeye devam edin ve yarat\u0131c\u0131l\u0131\u011f\u0131n\u0131z\u0131 web uygulamalar\u0131n\u0131za yans\u0131t\u0131n.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Vue.js&#8217;te Etkinlikler ile Kullan\u0131c\u0131 Etkile\u015fimleri Olu\u015fturma Rehberi\nModern web uygulamalar\u0131, kullan\u0131c\u0131larla dinamik ve sezgisel bir \u015fekilde e","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-37245","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&#039;te Etkinlikler ile Kullan\u0131c\u0131 Etkile\u015fimleri Olu\u015fturma Rehberi - 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-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vue.js&#039;te Etkinlikler ile Kullan\u0131c\u0131 Etkile\u015fimleri Olu\u015fturma Rehberi\" \/>\n<meta property=\"og:description\" content=\"Vue.js&#039;te Etkinlikler ile Kullan\u0131c\u0131 Etkile\u015fimleri Olu\u015fturma Rehberi Modern web uygulamalar\u0131, kullan\u0131c\u0131larla dinamik ve sezgisel bir \u015fekilde e\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/vue-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-29T08:40:55+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=\"13 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Vue.js&#8217;te Etkinlikler ile Kullan\u0131c\u0131 Etkile\u015fimleri Olu\u015fturma Rehberi\",\"datePublished\":\"2025-12-29T08:40:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/\"},\"wordCount\":2150,\"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-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/vue-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/\",\"name\":\"Vue.js'te Etkinlikler ile Kullan\u0131c\u0131 Etkile\u015fimleri Olu\u015fturma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-29T08:40:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vue.js&#8217;te Etkinlikler ile Kullan\u0131c\u0131 Etkile\u015fimleri Olu\u015fturma Rehberi\"}]},{\"@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'te Etkinlikler ile Kullan\u0131c\u0131 Etkile\u015fimleri Olu\u015fturma Rehberi - 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-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Vue.js'te Etkinlikler ile Kullan\u0131c\u0131 Etkile\u015fimleri Olu\u015fturma Rehberi","og_description":"Vue.js'te Etkinlikler ile Kullan\u0131c\u0131 Etkile\u015fimleri Olu\u015fturma Rehberi Modern web uygulamalar\u0131, kullan\u0131c\u0131larla dinamik ve sezgisel bir \u015fekilde e","og_url":"https:\/\/fatihsoysal.com\/blog\/vue-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-29T08:40:55+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"13 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/vue-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Vue.js&#8217;te Etkinlikler ile Kullan\u0131c\u0131 Etkile\u015fimleri Olu\u015fturma Rehberi","datePublished":"2025-12-29T08:40:55+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/"},"wordCount":2150,"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-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/vue-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/vue-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/","name":"Vue.js'te Etkinlikler ile Kullan\u0131c\u0131 Etkile\u015fimleri Olu\u015fturma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-29T08:40:55+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/vue-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/vue-jste-etkinlikler-ile-kullanici-etkilesimleri-olusturma-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Vue.js&#8217;te Etkinlikler ile Kullan\u0131c\u0131 Etkile\u015fimleri Olu\u015fturma Rehberi"}]},{"@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\/37245","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=37245"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37245\/revisions"}],"predecessor-version":[{"id":37246,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37245\/revisions\/37246"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37245"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37245"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37245"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}