{"id":32557,"date":"2025-10-23T07:41:17","date_gmt":"2025-10-23T04:41:17","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=32557"},"modified":"2025-10-23T07:41:17","modified_gmt":"2025-10-23T04:41:17","slug":"vue-jste-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/vue-jste-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/","title":{"rendered":"Vue.js&#8217;te \u00d6zyinelemeli Bile\u015fenler Aras\u0131nda \u0130leti\u015fim Kurmak"},"content":{"rendered":"<p><body><\/p>\n<h2>Vue.js&#8217;te \u00d6zyinelemeli Bile\u015fenler Aras\u0131nda \u0130leti\u015fim Kurmak<\/h2>\n<p>Vue.js, bile\u015fen tabanl\u0131 mimarisiyle karma\u015f\u0131k kullan\u0131c\u0131 aray\u00fczlerini y\u00f6netmeyi kolayla\u015ft\u0131ran g\u00fc\u00e7l\u00fc bir JavaScript \u00e7er\u00e7evesidir. Bu mimarinin \u00f6nemli bir y\u00f6n\u00fc, bile\u015fenlerin kendi kendini tekrar eden veya \u00f6zyinelemeli yap\u0131lar olu\u015fturabilmesidir. A\u011fa\u00e7 g\u00f6r\u00fcn\u00fcmleri, yorum dizileri, i\u00e7 i\u00e7e ge\u00e7mi\u015f men\u00fcler veya dosya sistemleri gibi hiyerar\u015fik verileri temsil ederken \u00f6zyinelemeli bile\u015fenler vazge\u00e7ilmezdir. Ancak, bu t\u00fcr derinlemesine i\u00e7 i\u00e7e ge\u00e7mi\u015f yap\u0131lar i\u00e7inde bile\u015fenler aras\u0131 ileti\u015fim kurmak, standart Vue.js ileti\u015fim mekanizmalar\u0131n\u0131n (props ve olaylar) s\u0131n\u0131rlar\u0131n\u0131 zorlayabilir ve yeni zorluklar ortaya \u00e7\u0131karabilir.<\/p>\n<p>Bu makalede, Vue.js&#8217;te \u00f6zyinelemeli bile\u015fenler aras\u0131nda etkili ve s\u00fcrd\u00fcr\u00fclebilir ileti\u015fim kurmak i\u00e7in \u00e7e\u015fitli stratejileri ve en iyi uygulamalar\u0131 derinlemesine inceleyece\u011fiz. Temel <code>props<\/code> ve <code>emit<\/code> yakla\u015f\u0131mlar\u0131ndan ba\u015flayarak, <code>provide\/inject<\/code>, olay veri yollar\u0131 (event bus), merkezi durum y\u00f6netimi (Vuex\/Pinia) ve Composition API&#8217;nin sundu\u011fu geli\u015fmi\u015f y\u00f6ntemlere kadar geni\u015f bir yelpazeyi ele alaca\u011f\u0131z. Amac\u0131m\u0131z, uygulaman\u0131z\u0131n karma\u015f\u0131kl\u0131\u011f\u0131na ve ihtiya\u00e7lar\u0131na en uygun ileti\u015fim desenini se\u00e7menize yard\u0131mc\u0131 olacak kapsaml\u0131 bir rehber sunmakt\u0131r.<\/p>\n<h3>\u00d6zyinelemeli Bile\u015fenleri Anlamak<\/h3>\n<p>Bir Vue bile\u015feninin \u00f6zyinelemeli olabilmesi i\u00e7in, kendi \u015fablonunda kendisini \u00e7a\u011f\u0131rmas\u0131 gerekir. Bu, bir bile\u015fenin kendi i\u00e7inde bir ba\u015fka \u00f6rne\u011fini olu\u015fturdu\u011fu anlam\u0131na gelir.<\/p>\n<h4>\u00d6zyinelemeli Bile\u015fen Nedir?<\/h4>\n<p>\u00d6zyinelemeli bile\u015fenler, genellikle a\u011fa\u00e7 benzeri veri yap\u0131lar\u0131n\u0131 g\u00f6rselle\u015ftirmek veya y\u00f6netmek i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, bir klas\u00f6r yap\u0131s\u0131n\u0131, i\u00e7 i\u00e7e ge\u00e7mi\u015f yorumlar\u0131 veya bir kategori hiyerar\u015fisini d\u00fc\u015f\u00fcn\u00fcn. Her bir &#8220;d\u00fc\u011f\u00fcm&#8221; veya &#8220;\u00f6\u011fe&#8221; ayn\u0131 bile\u015fen taraf\u0131ndan temsil edilir ve bu bile\u015fen, kendi alt d\u00fc\u011f\u00fcmlerini de ayn\u0131 bile\u015feni kullanarak render eder.<\/p>\n<p>Bu yap\u0131y\u0131 etkin bir \u015fekilde kullanabilmek i\u00e7in Vue&#8217;da baz\u0131 \u00f6zel ayarlamalar gereklidir:<\/p>\n<p>1.  <strong><code>name<\/code> \u00d6zelli\u011fi:<\/strong> Bir bile\u015fenin kendi \u015fablonunda kendisini \u00e7a\u011f\u0131rabilmesi i\u00e7in a\u00e7\u0131k\u00e7a bir <code>name<\/code> \u00f6zelli\u011fine sahip olmas\u0131 gerekir. Vue, bu <code>name<\/code> \u00f6zelli\u011fini kullanarak bile\u015fenin kendisini tan\u0131mas\u0131n\u0131 sa\u011flar.<br \/>\n2.  <strong>Durdurma Ko\u015fulu:<\/strong> Sonsuz d\u00f6ng\u00fcye girmemek i\u00e7in \u00f6zyinelemeli bile\u015fenlerin bir &#8220;durdurma ko\u015fulu&#8221; olmas\u0131 gerekir. Genellikle bu, bir d\u00fc\u011f\u00fcm\u00fcn alt \u00f6\u011fesi kalmad\u0131\u011f\u0131nda veya belirli bir derinli\u011fe ula\u015f\u0131ld\u0131\u011f\u0131nda \u00f6zyinelemenin sona ermesi anlam\u0131na gelir.<\/p>\n<h4>Temel Bir Uygulama \u00d6rne\u011fi<\/h4>\n<p>A\u015fa\u011f\u0131da, basit bir a\u011fa\u00e7 yap\u0131s\u0131n\u0131 temsil eden \u00f6zyinelemeli bir <code>TreeItem<\/code> bile\u015feni \u00f6rne\u011fi bulunmaktad\u0131r:<\/p>\n<pre><code class=\"language-vue\"><!-- TreeItem.vue -->\n<template>\n  <li>\n    <div @click=\"toggleChildren\" :class=\"{ 'has-children': hasChildren }\">\n      {{ item.name }}\n      <span v-if=\"hasChildren\">[{{ isOpen ? '-' : '+' }}]<\/span>\n    <\/div>\n    <ul v-if=\"isOpen &#038;&#038; hasChildren\">\n      <TreeItem\n        v-for=\"child in item.children\"\n        :key=\"child.id\"\n        :item=\"child\"\n      \/>\n    <\/ul>\n  <\/li>\n<\/template>\n\n<script>\nexport default {\n  name: 'TreeItem', \/\/ Kendi i\u00e7inde \u00e7a\u011fr\u0131labilmesi i\u00e7in gerekli\n  props: {\n    item: {\n      type: Object,\n      required: true\n    }\n  },\n  data() {\n    return {\n      isOpen: false\n    };\n  },\n  computed: {\n    hasChildren() {\n      return this.item.children && this.item.children.length > 0;\n    }\n  },\n  methods: {\n    toggleChildren() {\n      if (this.hasChildren) {\n        this.isOpen = !this.isOpen;\n      }\n    }\n  }\n};\n<\/script>\n\n<style scoped>\nli {\n  list-style-type: none;\n  margin-left: 20px;\n}\n.has-children {\n  cursor: pointer;\n  font-weight: bold;\n}\n<\/style><\/code><\/pre>\n<p>Bu <code>TreeItem<\/code> bile\u015feni, bir <code>item<\/code> prop&#8217;u al\u0131r. E\u011fer <code>item<\/code>&#8216;\u0131n <code>children<\/code> \u00f6zelli\u011fi varsa, bu alt \u00f6\u011feleri yine <code>TreeItem<\/code> bile\u015fenini kullanarak render eder. <code>isOpen<\/code> durumu, alt \u00f6\u011felerin g\u00f6r\u00fcn\u00fcrl\u00fc\u011f\u00fcn\u00fc kontrol eder.<\/p>\n<h3>\u0130leti\u015fimdeki Zorluklar<\/h3>\n<p>\u00d6zyinelemeli bile\u015fenler kendi i\u00e7inde mant\u0131kl\u0131 bir yap\u0131 sunsa da, bu bile\u015fenler aras\u0131nda veri ak\u0131\u015f\u0131n\u0131 ve etkile\u015fimleri y\u00f6netmek standart Vue.js uygulamalar\u0131na g\u00f6re daha karma\u015f\u0131k hale gelebilir.<\/p>\n<h4>Derin \u0130\u00e7 \u0130\u00e7e Ge\u00e7me Sorunlar\u0131<\/h4>\n<p>*   <strong>Prop Delme (Prop Drilling):<\/strong> Bir veriyi, aradaki bir\u00e7ok bile\u015fenin asl\u0131nda o veriye ihtiyac\u0131 olmad\u0131\u011f\u0131 halde, bir \u00fcst bile\u015fenden alt bile\u015fenlere do\u011fru ard\u0131\u015f\u0131k olarak ge\u00e7irmek &#8220;prop delme&#8221; olarak adland\u0131r\u0131l\u0131r. \u00d6zyinelemeli yap\u0131larda, bir verinin en \u00fcstten en alt d\u00fc\u011f\u00fcme ula\u015fmas\u0131 i\u00e7in onlarca hatta y\u00fczlerce bile\u015fenden ge\u00e7mesi gerekebilir. Bu durum, kodu okunaks\u0131z, bak\u0131m\u0131 zor ve hata ay\u0131klamay\u0131 karma\u015f\u0131k hale getirir.<br \/>\n*   <strong>Olay Baloncuklanmas\u0131 (Event Bubbling):<\/strong> Benzer \u015fekilde, bir alt bile\u015fenden \u00fcst bile\u015fenlere do\u011fru olay yaymak (emit etmek) da zorluklar yarat\u0131r. Bir olay en alt seviyeden yay\u0131ld\u0131\u011f\u0131nda, her \u00fcst bile\u015fenin bu olay\u0131 dinlemesi ve tekrar yukar\u0131ya do\u011fru yaymas\u0131 gerekebilir. Bu da prop delmeye benzer \u015fekilde fazla kod tekrar\u0131na ve karma\u015f\u0131k bir olay ak\u0131\u015f\u0131na yol a\u00e7ar.<br \/>\n*   <strong>Do\u011frudan Eri\u015fim (<code>$parent<\/code>, <code>$children<\/code>):<\/strong> Vue, <code>this.$parent<\/code> ve <code>this.$children<\/code> gibi \u00f6zelliklerle ebeveyn ve \u00e7ocuk bile\u015fenlere do\u011frudan eri\u015fim imkan\u0131 sunsa da, bu y\u00f6ntemler genellikle tavsiye edilmez. \u00c7\u00fcnk\u00fc bile\u015fenler aras\u0131nda s\u0131k\u0131 bir ba\u011f\u0131ml\u0131l\u0131k olu\u015fturur, yeniden kullan\u0131labilirli\u011fi azalt\u0131r ve \u00f6zellikle \u00f6zyinelemeli yap\u0131larda \u00f6ng\u00f6r\u00fclemez davran\u0131\u015flara yol a\u00e7abilir. Reaktiviteyi ve bile\u015fen ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc y\u00f6netmek zorla\u015f\u0131r.<\/p>\n<h4>Durum Y\u00f6netimi Karma\u015f\u0131kl\u0131\u011f\u0131<\/h4>\n<p>Bir a\u011fa\u00e7 yap\u0131s\u0131n\u0131n herhangi bir yerindeki bir d\u00fc\u011f\u00fcm\u00fcn durumunu (\u00f6rne\u011fin, se\u00e7ili olma, geni\u015fletilmi\u015f olma, pasif olma) de\u011fi\u015ftirmek ve bu de\u011fi\u015fikli\u011fi a\u011fac\u0131n di\u011fer b\u00f6l\u00fcmlerine (\u00fcst, alt veya karde\u015f d\u00fc\u011f\u00fcmler) yans\u0131tmak, merkezi bir durum y\u00f6netimi stratejisi olmadan olduk\u00e7a zorlay\u0131c\u0131d\u0131r. Bir d\u00fc\u011f\u00fcm\u00fcn se\u00e7ilmesi, di\u011fer t\u00fcm d\u00fc\u011f\u00fcmlerin se\u00e7iminin kald\u0131r\u0131lmas\u0131n\u0131 gerektirebilir veya bir d\u00fc\u011f\u00fcm\u00fcn geni\u015fletilmesi, alt\u0131ndaki t\u00fcm d\u00fc\u011f\u00fcmlerin de belirli bir \u015fekilde davranmas\u0131n\u0131 tetikleyebilir.<\/p>\n<h3>\u0130leti\u015fim Desenleri<\/h3>\n<p>Bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in Vue.js ekosisteminde ve genel olarak bile\u015fen tabanl\u0131 mimarilerde farkl\u0131 ileti\u015fim desenleri geli\u015ftirilmi\u015ftir. \u015eimdi bu desenleri \u00f6zyinelemeli bile\u015fenler ba\u011flam\u0131nda inceleyelim.<\/p>\n<h4>1. Props ve Events (Temel Yakla\u015f\u0131m)<\/h4>\n<p>Vue.js&#8217;in en temel ve tavsiye edilen ileti\u015fim \u015fekli, veriyi <code>props<\/code> arac\u0131l\u0131\u011f\u0131yla yukar\u0131dan a\u015fa\u011f\u0131ya (ebeveynden \u00e7ocu\u011fa) ve olaylar\u0131 <code>emit<\/code> arac\u0131l\u0131\u011f\u0131yla a\u015fa\u011f\u0131dan yukar\u0131ya (\u00e7ocuktan ebeveyne) aktarmakt\u0131r. \u00d6zyinelemeli bile\u015fenlerde de her bir <code>TreeItem<\/code> \u00f6rne\u011fi, kendi alt <code>TreeItem<\/code> \u00f6rnekleri i\u00e7in bir ebeveyn g\u00f6revi g\u00f6r\u00fcr.<\/p>\n<p>*   <strong>Props Down:<\/strong> Her <code>TreeItem<\/code> bile\u015feni, <code>item<\/code> prop&#8217;u arac\u0131l\u0131\u011f\u0131yla kendi verisini al\u0131r. E\u011fer bu <code>item<\/code>&#8216;\u0131n alt \u00f6\u011feleri varsa, her bir alt \u00f6\u011fe i\u00e7in yeni bir <code>TreeItem<\/code> \u00f6rne\u011fi olu\u015fturulurken, ilgili alt \u00f6\u011fe verisi yeni <code>TreeItem<\/code>&#8216;a <code>item<\/code> prop&#8217;u olarak ge\u00e7irilir.<br \/>\n*   <strong>Events Up:<\/strong> Bir alt <code>TreeItem<\/code>&#8216;da bir eylem (\u00f6rne\u011fin, bir d\u00fc\u011f\u00fcme t\u0131klama) ger\u00e7ekle\u015fti\u011finde, bu eylemi \u00fcst bile\u015fene bildirmek i\u00e7in <code>this.$emit()<\/code> kullan\u0131l\u0131r. \u00dcst bile\u015fen bu olay\u0131 dinler ve kendi \u00fcst bile\u015fenine tekrar emit edebilir veya do\u011frudan i\u015fleyebilir.<\/p>\n<p><strong>\u00d6rnek: Bir D\u00fc\u011f\u00fcm\u00fcn Se\u00e7ilmesi<\/strong><\/p>\n<p>Diyelim ki bir <code>TreeItem<\/code> se\u00e7ildi\u011finde, bu bilgiyi a\u011fac\u0131n en \u00fcst bile\u015fenine ula\u015ft\u0131rmak istiyoruz.<\/p>\n<pre><code class=\"language-vue\"><!-- TreeItem.vue (Props ve Events ile) -->\n<template>\n  <li>\n    <div\n      @click=\"selectNode\"\n      :class=\"{ 'has-children': hasChildren, 'selected': isSelected }\"\n    >\n      {{ item.name }}\n      <span v-if=\"hasChildren\" @click.stop=\"toggleChildren\">\n        [{{ isOpen ? '-' : '+' }}]\n      <\/span>\n    <\/div>\n    <ul v-if=\"isOpen &#038;&#038; hasChildren\">\n      <TreeItem\n        v-for=\"child in item.children\"\n        :key=\"child.id\"\n        :item=\"child\"\n        :selected-node-id=\"selectedNodeId\"\n        @node-selected=\"$emit('node-selected', $event)\"\n        @node-toggled=\"$emit('node-toggled', $event)\"\n      \/>\n    <\/ul>\n  <\/li>\n<\/template>\n\n<script>\nexport default {\n  name: 'TreeItem',\n  props: {\n    item: {\n      type: Object,\n      required: true\n    },\n    selectedNodeId: { \/\/ Se\u00e7ili d\u00fc\u011f\u00fcm\u00fcn ID'sini prop olarak al\n      type: [String, Number],\n      default: null\n    }\n  },\n  data() {\n    return {\n      isOpen: false\n    };\n  },\n  computed: {\n    hasChildren() {\n      return this.item.children && this.item.children.length > 0;\n    },\n    isSelected() {\n      return this.item.id === this.selectedNodeId;\n    }\n  },\n  methods: {\n    toggleChildren() {\n      if (this.hasChildren) {\n        this.isOpen = !this.isOpen;\n        this.$emit('node-toggled', this.item.id); \/\/ D\u00fc\u011f\u00fcm\u00fcn a\u00e7\u0131l\u0131p kapand\u0131\u011f\u0131n\u0131 bildir\n      }\n    },\n    selectNode() {\n      this.$emit('node-selected', this.item.id); \/\/ D\u00fc\u011f\u00fcm\u00fcn se\u00e7ildi\u011fini bildir\n    }\n  }\n};\n<\/script>\n\n<style scoped>\n\/<em> ... (\u00f6nceki stil) <\/em>\/\n.selected {\n  background-color: #e0e0e0;\n}\n<\/style><\/code><\/pre>\n<p>En \u00fcstteki ana bile\u015fen (\u00f6rne\u011fin <code>App.vue<\/code>) bu olay\u0131 dinleyebilir ve <code>selectedNodeId<\/code> durumunu g\u00fcncelleyebilir:<\/p>\n<pre><code class=\"language-vue\"><!-- App.vue -->\n<template>\n  <div>\n    <h2>A\u011fa\u00e7 Yap\u0131s\u0131<\/h2>\n    <ul>\n      <TreeItem\n        v-for=\"rootItem in treeData\"\n        :key=\"rootItem.id\"\n        :item=\"rootItem\"\n        :selected-node-id=\"currentSelectedNodeId\"\n        @node-selected=\"handleNodeSelected\"\n      \/>\n    <\/ul>\n    <p v-if=\"currentSelectedNodeId\">Se\u00e7ili D\u00fc\u011f\u00fcm ID: {{ currentSelectedNodeId }}<\/p>\n  <\/div>\n<\/template>\n\n<script>\nimport TreeItem from '.\/components\/TreeItem.vue';\n\nexport default {\n  components: {\n    TreeItem\n  },\n  data() {\n    return {\n      treeData: [\n        { id: 1, name: 'K\u00f6k 1', children: [\n          { id: 2, name: '\u00c7ocuk 1.1', children: [\n            { id: 3, name: 'Torun 1.1.1' },\n            { id: 4, name: 'Torun 1.1.2' }\n          ]},\n          { id: 5, name: '\u00c7ocuk 1.2' }\n        ]},\n        { id: 6, name: 'K\u00f6k 2', children: [\n          { id: 7, name: '\u00c7ocuk 2.1' }\n        ]}\n      ],\n      currentSelectedNodeId: null\n    };\n  },\n  methods: {\n    handleNodeSelected(nodeId) {\n      this.currentSelectedNodeId = nodeId;\n      console.log('Se\u00e7ilen d\u00fc\u011f\u00fcm ID:', nodeId);\n    }\n  }\n};\n<\/script><\/code><\/pre>\n<p><strong>S\u0131n\u0131rlamalar:<\/strong> Bu yakla\u015f\u0131m, \u00f6zellikle derin a\u011fa\u00e7 yap\u0131lar\u0131nda prop delme ve olay baloncuklanmas\u0131 sorunlar\u0131na yol a\u00e7ar. Bir d\u00fc\u011f\u00fcm\u00fcn se\u00e7ili olma durumunu en \u00fcst seviyeden her bir <code>TreeItem<\/code>&#8216;a <code>selectedNodeId<\/code> prop&#8217;u olarak ge\u00e7irmek, aradaki t\u00fcm <code>TreeItem<\/code>&#8216;lar\u0131n bu prop&#8217;u al\u0131p alt bile\u015fenlerine aktarmas\u0131n\u0131 gerektirir. Bu, kodun okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 zorla\u015ft\u0131r\u0131r.<\/p>\n<h4>2. Provide\/Inject<\/h4>\n<p><code>provide<\/code> ve <code>inject<\/code>, bir ebeveyn bile\u015fenin (veya herhangi bir \u00fcst bile\u015fenin) veri veya fonksiyonlar\u0131 sa\u011flamas\u0131na ve herhangi bir alt bile\u015fenin (ne kadar derin olursa olsun) bu sa\u011flanan veriyi do\u011frudan enjekte etmesine olanak tan\u0131r. Bu, prop delme sorununu \u00e7\u00f6zmek i\u00e7in m\u00fckemmel bir y\u00f6ntemdir.<\/p>\n<p>*   <strong>Provide:<\/strong> Bir \u00fcst bile\u015fen, <code>provide<\/code> se\u00e7ene\u011fini veya Composition API&#8217;daki <code>provide<\/code> fonksiyonunu kullanarak veri veya fonksiyonlar\u0131 sa\u011flar. Bu veriler bir anahtar ile ili\u015fkilendirilir.<br \/>\n*   <strong>Inject:<\/strong> Herhangi bir alt bile\u015fen, <code>inject<\/code> se\u00e7ene\u011fini veya Composition API&#8217;daki <code>inject<\/code> fonksiyonunu kullanarak belirli bir anahtarla sa\u011flanan veriyi enjekte edebilir.<\/p>\n<p><strong>Kullan\u0131m Alanlar\u0131:<\/strong> Global yap\u0131land\u0131rma ayarlar\u0131, payla\u015f\u0131lan hizmetler veya a\u011fa\u00e7 yap\u0131s\u0131 genelinde de\u011fi\u015fmesi beklenen ancak \u00e7ok s\u0131k g\u00fcncellenmeyen durumlar i\u00e7in idealdir. Reaktif veri sa\u011flamak da m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<p><strong>\u00d6rnek: A\u011fa\u00e7 Y\u00f6netimi Fonksiyonlar\u0131 Sa\u011flamak<\/strong><\/p>\n<p>T\u00fcm a\u011fa\u00e7 genelinde ge\u00e7erli olacak bir <code>selectNode<\/code> fonksiyonunu ve <code>selectedNodeId<\/code> reaktif verisini sa\u011flamak i\u00e7in <code>provide\/inject<\/code> kullanabiliriz.<\/p>\n<pre><code class=\"language-vue\"><!-- App.vue (Provide\/Inject ile) -->\n<template>\n  <div>\n    <h2>A\u011fa\u00e7 Yap\u0131s\u0131 (Provide\/Inject)<\/h2>\n    <ul>\n      <TreeItem\n        v-for=\"rootItem in treeData\"\n        :key=\"rootItem.id\"\n        :item=\"rootItem\"\n      \/>\n    <\/ul>\n    <p v-if=\"currentSelectedNodeId\">Se\u00e7ili D\u00fc\u011f\u00fcm ID: {{ currentSelectedNodeId }}<\/p>\n  <\/div>\n<\/template>\n\n<script>\nimport { ref, provide, computed } from 'vue';\nimport TreeItem from '.\/components\/TreeItem.vue';\n\nexport default {\n  components: {\n    TreeItem\n  },\n  setup() { \/\/ Composition API ile provide kullanmak daha esnektir\n    const treeData = ref([\n      { id: 1, name: 'K\u00f6k 1', children: [\n        { id: 2, name: '\u00c7ocuk 1.1', children: [\n          { id: 3, name: 'Torun 1.1.1' },\n          { id: 4, name: 'Torun 1.1.2' }\n        ]},\n        { id: 5, name: '\u00c7ocuk 1.2' }\n      ]},\n      { id: 6, name: 'K\u00f6k 2', children: [\n        { id: 7, name: '\u00c7ocuk 2.1' }\n      ]}\n    ]);\n\n    const currentSelectedNodeId = ref(null);\n\n    const selectNode = (nodeId) => {\n      currentSelectedNodeId.value = nodeId;\n      console.log('Se\u00e7ilen d\u00fc\u011f\u00fcm ID:', nodeId);\n    };\n\n    \/\/ Sa\u011flanacak veriyi ve fonksiyonlar\u0131 bir obje i\u00e7inde grupland\u0131rabiliriz\n    provide('tree-manager', {\n      selectedNodeId: computed(() => currentSelectedNodeId.value), \/\/ Reaktif olarak sa\u011fla\n      selectNode\n    });\n\n    return {\n      treeData,\n      currentSelectedNodeId\n    };\n  }\n};\n<\/script><\/code><\/pre>\n<p>\u015eimdi <code>TreeItem<\/code> bile\u015feni, <code>selectedNodeId<\/code>&#8216;yi prop olarak almak yerine do\u011frudan enjekte edebilir ve <code>selectNode<\/code> fonksiyonunu \u00e7a\u011f\u0131rabilir:<\/p>\n<pre><code class=\"language-vue\"><!-- TreeItem.vue (Provide\/Inject ile) -->\n<template>\n  <li>\n    <div\n      @click=\"handleNodeClick\"\n      :class=\"{ 'has-children': hasChildren, 'selected': isSelected }\"\n    >\n      {{ item.name }}\n      <span v-if=\"hasChildren\" @click.stop=\"toggleChildren\">\n        [{{ isOpen ? '-' : '+' }}]\n      <\/span>\n    <\/div>\n    <ul v-if=\"isOpen &#038;&#038; hasChildren\">\n      <TreeItem\n        v-for=\"child in item.children\"\n        :key=\"child.id\"\n        :item=\"child\"\n      \/>\n    <\/ul>\n  <\/li>\n<\/template>\n\n<script>\nimport { ref, computed, inject } from 'vue';\n\nexport default {\n  name: 'TreeItem',\n  props: {\n    item: {\n      type: Object,\n      required: true\n    }\n  },\n  setup(props) { \/\/ Composition API ile inject kullan\n    const isOpen = ref(false);\n    const hasChildren = computed(() => props.item.children && props.item.children.length > 0);\n\n    \/\/ tree-manager'\u0131 enjekte et\n    const treeManager = inject('tree-manager');\n\n    \/\/ Reaktif olarak sa\u011flanan selectedNodeId'yi kullan\n    const isSelected = computed(() => props.item.id === treeManager.selectedNodeId.value);\n\n    const toggleChildren = () => {\n      if (hasChildren.value) {\n        isOpen.value = !isOpen.value;\n      }\n    };\n\n    const handleNodeClick = () => {\n      treeManager.selectNode(props.item.id); \/\/ Sa\u011flanan fonksiyonu \u00e7a\u011f\u0131r\n    };\n\n    return {\n      isOpen,\n      hasChildren,\n      isSelected,\n      toggleChildren,\n      handleNodeClick\n    };\n  }\n};\n<\/script><\/code><\/pre>\n<p><strong>S\u0131n\u0131rlamalar:<\/strong> <code>provide\/inject<\/code> prop delmeyi ortadan kald\u0131rsa da, bile\u015fenler aras\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar\u0131 daha az belirgin hale getirebilir. Ayr\u0131ca, esas olarak yukar\u0131dan a\u015fa\u011f\u0131ya ileti\u015fim i\u00e7in tasarlanm\u0131\u015ft\u0131r. Alt bile\u015fenlerin \u00fcst bile\u015fenlerdeki durumu do\u011frudan de\u011fi\u015ftirmesi i\u00e7in ba\u015fka desenlerle birle\u015ftirilmesi gerekebilir (\u00f6rne\u011fin, sa\u011flanan bir fonksiyon arac\u0131l\u0131\u011f\u0131yla).<\/p>\n<h4>3. Event Bus (Global Olay Yay\u0131c\u0131)<\/h4>\n<p>Bir olay veri yolu (event bus), uygulaman\u0131n herhangi bir yerinden olaylar\u0131 yay\u0131nlayabilen ve dinleyebilen merkezi bir mekanizmad\u0131r. Bile\u015fenler aras\u0131nda do\u011frudan ebeveyn-\u00e7ocuk ili\u015fkisi olmayan veya \u00e7ok uzak bile\u015fenler aras\u0131nda ileti\u015fim kurmak i\u00e7in kullan\u0131labilir. Vue 3&#8217;te bir <code>mitt<\/code> k\u00fct\u00fcphanesi gibi hafif bir olay yay\u0131c\u0131 k\u00fct\u00fcphanesi kullanmak yayg\u0131n bir yakla\u015f\u0131md\u0131r.<\/p>\n<p>*   <strong>Nas\u0131l \u00c7al\u0131\u015f\u0131r:<\/strong> Uygulaman\u0131n herhangi bir yerinde eri\u015filebilen tek bir olay yay\u0131c\u0131 \u00f6rne\u011fi olu\u015fturulur. Bile\u015fenler bu \u00f6rne\u011fe olaylar\u0131 yay\u0131mlar (<code>emit<\/code>) ve di\u011fer bile\u015fenler bu \u00f6rne\u011fe belirli olaylar\u0131 dinlemek i\u00e7in kaydolur (<code>on<\/code>).<\/p>\n<p><strong>\u00d6rnek: Bir D\u00fc\u011f\u00fcm\u00fcn Se\u00e7ildi\u011fini Global Olarak Bildirme<\/strong><\/p>\n<p>\u00d6nce bir olay veri yolu olu\u015ftural\u0131m (\u00f6rne\u011fin <code>eventBus.js<\/code>):<\/p>\n<pre><code class=\"language-javascript\">\/\/ eventBus.js\nimport mitt from 'mitt';\nconst emitter = mitt();\nexport default emitter;<\/code><\/pre>\n<p>Sonra <code>TreeItem<\/code> bile\u015feninde bir d\u00fc\u011f\u00fcm se\u00e7ildi\u011finde olay\u0131 yay\u0131nlayabiliriz:<\/p>\n<pre><code class=\"language-vue\"><!-- TreeItem.vue (Event Bus ile) -->\n<template>\n  <li>\n    <div\n      @click=\"selectNode\"\n      :class=\"{ 'has-children': hasChildren, 'selected': isSelected }\"\n    >\n      {{ item.name }}\n      <span v-if=\"hasChildren\" @click.stop=\"toggleChildren\">\n        [{{ isOpen ? '-' : '+' }}]\n      <\/span>\n    <\/div>\n    <ul v-if=\"isOpen &#038;&#038; hasChildren\">\n      <TreeItem\n        v-for=\"child in item.children\"\n        :key=\"child.id\"\n        :item=\"child\"\n      \/>\n    <\/ul>\n  <\/li>\n<\/template>\n\n<script>\nimport { ref, computed, onMounted, onUnmounted } from 'vue';\nimport emitter from '.\/eventBus'; \/\/ Event bus'\u0131 import et\n\nexport default {\n  name: 'TreeItem',\n  props: {\n    item: {\n      type: Object,\n      required: true\n    }\n  },\n  setup(props) {\n    const isOpen = ref(false);\n    const currentSelectedNodeId = ref(null); \/\/ Kendi i\u00e7 durumu\n\n    const hasChildren = computed(() => props.item.children && props.item.children.length > 0);\n    const isSelected = computed(() => props.item.id === currentSelectedNodeId.value);\n\n    const toggleChildren = () => {\n      if (hasChildren.value) {\n        isOpen.value = !isOpen.value;\n      }\n    };\n\n    const selectNode = () => {\n      emitter.emit('node-selected', props.item.id); \/\/ Olay\u0131 yay\u0131nla\n    };\n\n    \/\/ Olay\u0131 dinle ve kendi i\u00e7 durumunu g\u00fcncelle\n    const handleNodeSelected = (nodeId) => {\n      currentSelectedNodeId.value = nodeId;\n    };\n\n    onMounted(() => {\n      emitter.on('node-selected', handleNodeSelected);\n    });\n\n    onUnmounted(() => {\n      emitter.off('node-selected', handleNodeSelected); \/\/ Bellek s\u0131z\u0131nt\u0131s\u0131n\u0131 \u00f6nle\n    });\n\n    return {\n      isOpen,\n      hasChildren,\n      isSelected,\n      toggleChildren,\n      selectNode\n    };\n  }\n};\n<\/script><\/code><\/pre>\n<p><code>App.vue<\/code> bile\u015feninin art\u0131k do\u011frudan olay dinlemesi gerekmez; <code>TreeItem<\/code> bile\u015fenleri kendi aralar\u0131nda ve <code>App.vue<\/code> ile event bus arac\u0131l\u0131\u011f\u0131yla ileti\u015fim kurabilir. <code>App.vue<\/code> bile\u015feni yine de <code>currentSelectedNodeId<\/code>&#8216;yi izlemek istiyorsa, o da event bus&#8217;\u0131 dinleyebilir.<\/p>\n<p><strong>S\u0131n\u0131rlamalar:<\/strong> Event bus&#8217;lar k\u00fc\u00e7\u00fck uygulamalar i\u00e7in h\u0131zl\u0131 bir \u00e7\u00f6z\u00fcm sunsa da, b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda sorunlara yol a\u00e7abilir:<br \/>\n*   <strong>Takip Etmesi Zor:<\/strong> Hangi bile\u015fenin hangi olay\u0131 yay\u0131nlad\u0131\u011f\u0131n\u0131 veya dinledi\u011fini takip etmek zorla\u015f\u0131r.<br \/>\n*   <strong>Hata Ay\u0131klama G\u00fc\u00e7l\u00fc\u011f\u00fc:<\/strong> Olaylar\u0131n kayna\u011f\u0131n\u0131 ve ak\u0131\u015f\u0131n\u0131 anlamak karma\u015f\u0131k olabilir, bu da hata ay\u0131klamay\u0131 zorla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Bellek S\u0131z\u0131nt\u0131s\u0131 Riski:<\/strong> <code>onUnmounted<\/code> ya\u015fam d\u00f6ng\u00fcs\u00fc kancas\u0131nda dinleyicileri kald\u0131rmay\u0131 unutmak, bellek s\u0131z\u0131nt\u0131lar\u0131na yol a\u00e7abilir.<br \/>\n*   <strong>A\u015f\u0131r\u0131 Ba\u011f\u0131ml\u0131l\u0131k:<\/strong> Bile\u015fenler aras\u0131nda \u00f6rt\u00fck ba\u011f\u0131ml\u0131l\u0131klar olu\u015fturur.<\/p>\n<p>Genel olarak, event bus&#8217;lar yaln\u0131zca \u00e7ok \u00f6zel durumlar i\u00e7in (\u00f6rne\u011fin, \u00e7ok uzak ve ili\u015fkisiz bile\u015fenler aras\u0131nda tek seferlik ileti\u015fim) d\u00fc\u015f\u00fcn\u00fclmeli ve genellikle daha yap\u0131land\u0131r\u0131lm\u0131\u015f durum y\u00f6netimi \u00e7\u00f6z\u00fcmleri tercih edilmelidir.<\/p>\n<h4>4. Vuex \/ Pinia (Durum Y\u00f6netimi K\u00fct\u00fcphaneleri)<\/h4>\n<p>Karma\u015f\u0131k ve b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalarda, \u00f6zellikle \u00f6zyinelemeli bile\u015fenlerin derinlemesine i\u00e7 i\u00e7e ge\u00e7ti\u011fi ve durumun bir\u00e7ok yerde payla\u015f\u0131lmas\u0131 ve g\u00fcncellenmesi gerekti\u011fi durumlarda, merkezi bir durum y\u00f6netimi k\u00fct\u00fcphanesi kullanmak en sa\u011flam \u00e7\u00f6z\u00fcmd\u00fcr. Vuex (Vue 2 i\u00e7in daha yayg\u0131n, Vue 3 ile de kullan\u0131labilir) ve Pinia (Vue 3 i\u00e7in \u00f6nerilen, daha hafif ve basit) bu ama\u00e7la tasarlanm\u0131\u015ft\u0131r.<\/p>\n<p>*   <strong>Nas\u0131l \u00c7al\u0131\u015f\u0131r:<\/strong> Uygulaman\u0131n t\u00fcm durumu tek bir merkezi depoda (store) saklan\u0131r. Bile\u015fenler bu durumu do\u011frudan de\u011fi\u015ftirmez, bunun yerine depolar\u0131n tan\u0131mlad\u0131\u011f\u0131 &#8220;eylemleri&#8221; (actions) veya &#8220;mutasyonlar\u0131&#8221; (mutations) \u00e7a\u011f\u0131rarak durumu de\u011fi\u015ftirirler. Durum de\u011fi\u015fiklikleri reaktiftir ve duruma abone olan t\u00fcm bile\u015fenler otomatik olarak g\u00fcncellenir.<\/p>\n<p><strong>\u00d6rnek: Pinia ile D\u00fc\u011f\u00fcm Se\u00e7imini Y\u00f6netme<\/strong><\/p>\n<p>\u00d6nce bir Pinia store olu\u015ftural\u0131m (\u00f6rne\u011fin <code>stores\/tree.js<\/code>):<\/p>\n<pre><code class=\"language-javascript\">\/\/ stores\/tree.js\nimport { defineStore } from 'pinia';\n\nexport const useTreeStore = defineStore('tree', {\n  state: () => ({\n    selectedNodeId: null,\n    \/\/ Di\u011fer a\u011fa\u00e7la ilgili durumlar buraya eklenebilir\n  }),\n  getters: {\n    \/\/ Getter'lar ile durumu hesaplayabiliriz\n    \/\/ isNodeSelected: (state) => (nodeId) => state.selectedNodeId === nodeId\n  },\n  actions: {\n    selectNode(nodeId) {\n      this.selectedNodeId = nodeId;\n      console.log('Pinia \u00fczerinden se\u00e7ilen d\u00fc\u011f\u00fcm ID:', nodeId);\n    },\n    clearSelection() {\n      this.selectedNodeId = null;\n    }\n  }\n});<\/code><\/pre>\n<p>\u015eimdi <code>App.vue<\/code> ve <code>TreeItem.vue<\/code> bile\u015fenleri bu store&#8217;u kullanabilir:<\/p>\n<pre><code class=\"language-vue\"><!-- App.vue (Pinia ile) -->\n<template>\n  <div>\n    <h2>A\u011fa\u00e7 Yap\u0131s\u0131 (Pinia)<\/h2>\n    <ul>\n      <TreeItem\n        v-for=\"rootItem in treeData\"\n        :key=\"rootItem.id\"\n        :item=\"rootItem\"\n      \/>\n    <\/ul>\n    <p v-if=\"treeStore.selectedNodeId\">Se\u00e7ili D\u00fc\u011f\u00fcm ID: {{ treeStore.selectedNodeId }}<\/p>\n    <button @click=\"treeStore.clearSelection\">Se\u00e7imi Temizle<\/button>\n  <\/div>\n<\/template>\n\n<script>\nimport { ref } from 'vue';\nimport { useTreeStore } from '.\/stores\/tree';\nimport TreeItem from '.\/components\/TreeItem.vue';\n\nexport default {\n  components: {\n    TreeItem\n  },\n  setup() {\n    const treeStore = useTreeStore(); \/\/ Store'u kullan\n\n    const treeData = ref([\n      \/\/ ... (\u00f6nceki treeData)\n      { id: 1, name: 'K\u00f6k 1', children: [\n        { id: 2, name: '\u00c7ocuk 1.1', children: [\n          { id: 3, name: 'Torun 1.1.1' },\n          { id: 4, name: 'Torun 1.1.2' }\n        ]},\n        { id: 5, name: '\u00c7ocuk 1.2' }\n      ]},\n      { id: 6, name: 'K\u00f6k 2', children: [\n        { id: 7, name: '\u00c7ocuk 2.1' }\n      ]}\n    ]);\n\n    return {\n      treeData,\n      treeStore \/\/ Store'u template'te kullanmak i\u00e7in d\u00f6nd\u00fcr\n    };\n  }\n};\n<\/script><\/code><\/pre>\n<pre><code class=\"language-vue\"><!-- TreeItem.vue (Pinia ile) -->\n<template>\n  <li>\n    <div\n      @click=\"selectNode\"\n      :class=\"{ 'has-children': hasChildren, 'selected': isSelected }\"\n    >\n      {{ item.name }}\n      <span v-if=\"hasChildren\" @click.stop=\"toggleChildren\">\n        [{{ isOpen ? '-' : '+' }}]\n      <\/span>\n    <\/div>\n    <ul v-if=\"isOpen &#038;&#038; hasChildren\">\n      <TreeItem\n        v-for=\"child in item.children\"\n        :key=\"child.id\"\n        :item=\"child\"\n      \/>\n    <\/ul>\n  <\/li>\n<\/template>\n\n<script>\nimport { ref, computed } from 'vue';\nimport { useTreeStore } from '.\/stores\/tree'; \/\/ Store'u import et\n\nexport default {\n  name: 'TreeItem',\n  props: {\n    item: {\n      type: Object,\n      required: true\n    }\n  },\n  setup(props) {\n    const treeStore = useTreeStore(); \/\/ Store'u kullan\n\n    const isOpen = ref(false);\n    const hasChildren = computed(() => props.item.children && props.item.children.length > 0);\n\n    \/\/ Store'dan se\u00e7ili d\u00fc\u011f\u00fcm ID'sini al ve reaktif olarak kullan\n    const isSelected = computed(() => props.item.id === treeStore.selectedNodeId);\n\n    const toggleChildren = () => {\n      if (hasChildren.value) {\n        isOpen.value = !isOpen.value;\n      }\n    };\n\n    const selectNode = () => {\n      treeStore.selectNode(props.item.id); \/\/ Store'daki action'\u0131 \u00e7a\u011f\u0131r\n    };\n\n    return {\n      isOpen,\n      hasChildren,\n      isSelected,\n      toggleChildren,\n      selectNode\n    };\n  }\n};\n<\/script><\/code><\/pre>\n<p><strong>Avantajlar\u0131:<\/strong><br \/>\n*   <strong>Merkezi Durum:<\/strong> T\u00fcm uygulama durumu tek bir yerde y\u00f6netilir, bu da tutarl\u0131l\u0131\u011f\u0131 sa\u011flar.<br \/>\n*   <strong>\u00d6ng\u00f6r\u00fclebilir De\u011fi\u015fiklikler:<\/strong> Durum de\u011fi\u015fiklikleri a\u00e7\u0131k\u00e7a tan\u0131mlanm\u0131\u015f eylemler ve mutasyonlar arac\u0131l\u0131\u011f\u0131yla ger\u00e7ekle\u015fir, bu da hatalar\u0131 ay\u0131klamay\u0131 kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Geli\u015ftirici Ara\u00e7lar\u0131:<\/strong> Vue Devtools, durum de\u011fi\u015fikliklerini izlemek ve zaman yolculu\u011fu hata ay\u0131klamas\u0131 yapmak i\u00e7in m\u00fckemmel destek sunar.<br \/>\n*   <strong>\u00d6l\u00e7eklenebilirlik:<\/strong> B\u00fcy\u00fck ve karma\u015f\u0131k uygulamalar i\u00e7in en iyi \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<p><strong>S\u0131n\u0131rlamalar:<\/strong><br \/>\n*   <strong>Ek Y\u00fck:<\/strong> K\u00fc\u00e7\u00fck uygulamalar i\u00e7in gereksiz bir soyutlama katman\u0131 ve \u00f6\u011frenme e\u011frisi getirebilir.<br \/>\n*   <strong>Karma\u015f\u0131kl\u0131k:<\/strong> Kurulumu ve kullan\u0131m\u0131, \u00f6zellikle Vuex&#8217;te, di\u011fer y\u00f6ntemlere g\u00f6re daha karma\u015f\u0131k olabilir (Pinia bu konuda daha basittir).<\/p>\n<h4>5. Composition API ve Reactivity (Geli\u015fmi\u015f Yakla\u015f\u0131mlar)<\/h4>\n<p>Vue 3&#8217;\u00fcn Composition API&#8217;si, mant\u0131\u011f\u0131 ve reaktif durumu yeniden kullan\u0131labilir &#8220;composable&#8221; fonksiyonlarda d\u00fczenleyerek, \u00f6zyinelemeli bile\u015fenler aras\u0131nda ileti\u015fim i\u00e7in g\u00fc\u00e7l\u00fc ve esnek yeni yollar sunar.<\/p>\n<h5>Payla\u015f\u0131lan Reaktif Durum<\/h5>\n<p>Basit durum y\u00f6netimi ihtiya\u00e7lar\u0131 i\u00e7in, Pinia veya Vuex gibi tam te\u015fekk\u00fcll\u00fc bir store kurmaya gerek kalmadan, Composition API&#8217;nin <code>ref<\/code>, <code>reactive<\/code> ve <code>computed<\/code> \u00f6zelliklerini kullanarak payla\u015f\u0131lan reaktif bir nesne olu\u015fturabiliriz.<\/p>\n<pre><code class=\"language-javascript\">\/\/ composables\/useTreeState.js\nimport { ref, computed } from 'vue';\n\nconst selectedNodeId = ref(null);\n\nexport function useTreeState() {\n  const selectNode = (nodeId) => {\n    selectedNodeId.value = nodeId;\n    console.log('Composable \u00fczerinden se\u00e7ilen d\u00fc\u011f\u00fcm ID:', nodeId);\n  };\n\n  const isNodeSelected = (nodeId) => {\n    return selectedNodeId.value === nodeId;\n  };\n\n  return {\n    selectedNodeId: computed(() => selectedNodeId.value), \/\/ computed ile d\u0131\u015far\u0131ya a\u00e7\n    selectNode,\n    isNodeSelected\n  };\n}<\/code><\/pre>\n<p>Bu <code>useTreeState<\/code> composable&#8217;\u0131, uygulaman\u0131n herhangi bir yerinde i\u00e7e aktar\u0131l\u0131p kullan\u0131labilir. <code>selectedNodeId<\/code> <code>ref<\/code>&#8216;i mod\u00fcl kapsam\u0131nda tan\u0131mland\u0131\u011f\u0131 i\u00e7in, onu i\u00e7e aktaran t\u00fcm bile\u015fenler ayn\u0131 <code>selectedNodeId<\/code>&#8216;ye eri\u015fir ve onu payla\u015f\u0131r.<\/p>\n<pre><code class=\"language-vue\"><!-- TreeItem.vue (Composable ile) -->\n<template>\n  <li>\n    <div\n      @click=\"selectNodeHandler\"\n      :class=\"{ 'has-children': hasChildren, 'selected': isSelected }\"\n    >\n      {{ item.name }}\n      <span v-if=\"hasChildren\" @click.stop=\"toggleChildren\">\n        [{{ isOpen ? '-' : '+' }}]\n      <\/span>\n    <\/div>\n    <ul v-if=\"isOpen &#038;&#038; hasChildren\">\n      <TreeItem\n        v-for=\"child in item.children\"\n        :key=\"child.id\"\n        :item=\"child\"\n      \/>\n    <\/ul>\n  <\/li>\n<\/template>\n\n<script>\nimport { ref, computed } from 'vue';\nimport { useTreeState } from '.\/composables\/useTreeState'; \/\/ Composable'\u0131 import et\n\nexport default {\n  name: 'TreeItem',\n  props: {\n    item: {\n      type: Object,\n      required: true\n    }\n  },\n  setup(props) {\n    const { selectedNodeId, selectNode, isNodeSelected } = useTreeState(); \/\/ Composable'\u0131 kullan\n\n    const isOpen = ref(false);\n    const hasChildren = computed(() => props.item.children && props.item.children.length > 0);\n\n    const isSelected = computed(() => isNodeSelected(props.item.id)); \/\/ Composable'dan gelen fonksiyonu kullan\n\n    const toggleChildren = () => {\n      if (hasChildren.value) {\n        isOpen.value = !isOpen.value;\n      }\n    };\n\n    const selectNodeHandler = () => {\n      selectNode(props.item.id); \/\/ Composable'dan gelen fonksiyonu \u00e7a\u011f\u0131r\n    };\n\n    return {\n      isOpen,\n      hasChildren,\n      isSelected,\n      toggleChildren,\n      selectNodeHandler\n    };\n  }\n};\n<\/script><\/code><\/pre>\n<p><code>App.vue<\/code> bile\u015feni de ayn\u0131 <code>useTreeState<\/code> composable&#8217;\u0131n\u0131 kullanarak <code>selectedNodeId<\/code>&#8216;yi g\u00f6r\u00fcnt\u00fcleyebilir.<\/p>\n<h5>Custom Composables ve Provide\/Inject Kombinasyonu<\/h5>\n<p>Daha karma\u015f\u0131k senaryolarda, <code>provide\/inject<\/code> ile custom composable&#8217;lar\u0131 birle\u015ftirebilirsiniz. Bu, bir composable&#8217;\u0131n sa\u011flad\u0131\u011f\u0131 durumu veya fonksiyonlar\u0131 yaln\u0131zca belirli bir alt a\u011fa\u00e7taki bile\u015fenlerin kullanmas\u0131n\u0131 istedi\u011finizde kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p>\u00d6rne\u011fin, bir <code>useTreeNavigation<\/code> composable&#8217;\u0131 olu\u015fturup, bunu ana a\u011fa\u00e7 bile\u015feninde <code>provide<\/code> edebilir ve <code>TreeItem<\/code> bile\u015fenlerinde <code>inject<\/code> edebilirsiniz. Bu, composable&#8217;\u0131 global hale getirmek yerine, yaln\u0131zca ilgili bile\u015fen alt a\u011fac\u0131nda kullan\u0131labilir k\u0131lar.<\/p>\n<pre><code class=\"language-javascript\">\/\/ composables\/useTreeNavigation.js\nimport { ref, computed, provide, inject } from 'vue';\n\nconst TREE_NAVIGATION_KEY = Symbol('tree-navigation');\n\nexport function createTreeNavigation() {\n  const selectedNodeId = ref(null);\n\n  const selectNode = (nodeId) => {\n    selectedNodeId.value = nodeId;\n  };\n\n  const isNodeSelected = (nodeId) => {\n    return selectedNodeId.value === nodeId;\n  };\n\n  \/\/ Bu composable'\u0131 sa\u011fla\n  provide(TREE_NAVIGATION_KEY, {\n    selectedNodeId: computed(() => selectedNodeId.value),\n    selectNode,\n    isNodeSelected\n  });\n}\n\nexport function useTreeNavigation() {\n  \/\/ Sa\u011flanan composable'\u0131 enjekte et\n  const navigation = inject(TREE_NAVIGATION_KEY);\n  if (!navigation) {\n    console.warn('useTreeNavigation composable must be used within a component that provides tree-navigation.');\n    return {\n      selectedNodeId: ref(null),\n      selectNode: () => {},\n      isNodeSelected: () => false\n    };\n  }\n  return navigation;\n}<\/code><\/pre>\n<p>Ana bile\u015fende <code>createTreeNavigation()<\/code> \u00e7a\u011fr\u0131l\u0131r ve <code>TreeItem<\/code>&#8216;lar <code>useTreeNavigation()<\/code> \u00e7a\u011fr\u0131s\u0131 ile enjekte eder.<\/p>\n<p><strong>Avantajlar\u0131:<\/strong><br \/>\n*   <strong>Esneklik:<\/strong> \u0130leti\u015fim desenlerini ve reaktif durumu uygulaman\u0131n ihtiya\u00e7lar\u0131na g\u00f6re uyarlamak i\u00e7in y\u00fcksek esneklik sunar.<br \/>\n*   <strong>Kod Yeniden Kullan\u0131m\u0131:<\/strong> Mant\u0131\u011f\u0131 ve durumu birden fazla bile\u015fen aras\u0131nda kolayca yeniden kullanmay\u0131 sa\u011flar.<br \/>\n*   <strong>Geli\u015ftirilmi\u015f D\u00fczen:<\/strong> \u0130lgili mant\u0131\u011f\u0131 tek bir yerde gruplayarak bile\u015fen kodunu daha temiz hale getirir.<br \/>\n*   <strong>Tip G\u00fcvenli\u011fi:<\/strong> TypeScript ile kullan\u0131ld\u0131\u011f\u0131nda m\u00fckemmel tip g\u00fcvenli\u011fi sa\u011flar.<\/p>\n<p><strong>S\u0131n\u0131rlamalar:<\/strong><br \/>\n*   <strong>\u00d6\u011frenme E\u011frisi:<\/strong> Composition API&#8217;ye ve composable desenlerine al\u0131\u015fmak biraz zaman alabilir.<br \/>\n*   <strong>A\u015f\u0131r\u0131 M\u00fchendislik Riski:<\/strong> Basit durumlar i\u00e7in gereksiz karma\u015f\u0131kl\u0131k yaratabilir.<\/p>\n<h3>En \u0130yi Uygulamalar ve Dikkat Edilmesi Gerekenler<\/h3>\n<p>\u00d6zyinelemeli bile\u015fenler aras\u0131nda ileti\u015fim kurarken, a\u015fa\u011f\u0131daki en iyi uygulamalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir:<\/p>\n<p>*   <strong>Do\u011fru Arac\u0131 Se\u00e7in:<\/strong> Her zaman en karma\u015f\u0131k \u00e7\u00f6z\u00fcm\u00fc kullanmaya \u00e7al\u0131\u015fmay\u0131n.<br \/>\n    *   K\u00fc\u00e7\u00fck, s\u0131\u011f a\u011fa\u00e7lar i\u00e7in <code>props<\/code> ve <code>events<\/code> yeterli olabilir.<br \/>\n    *   Prop delmeyi \u00f6nlemek i\u00e7in <code>provide\/inject<\/code> kullan\u0131n.<br \/>\n    *   Bile\u015fenler aras\u0131 nadir ve ba\u011f\u0131ms\u0131z ileti\u015fim i\u00e7in event bus&#8217;\u0131 dikkatli kullan\u0131n.<br \/>\n    *   B\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar ve karma\u015f\u0131k, payla\u015f\u0131lan durumlar i\u00e7in Pinia veya Vuex&#8217;i tercih edin.<br \/>\n    *   Esneklik ve yeniden kullan\u0131labilirlik i\u00e7in Composition API ve custom composable&#8217;lar\u0131 de\u011ferlendirin.<br \/>\n*   <strong>Netlik ve S\u00fcrd\u00fcr\u00fclebilirlik:<\/strong> Veri ak\u0131\u015f\u0131n\u0131 ve ileti\u015fim desenlerini m\u00fcmk\u00fcn oldu\u011funca a\u00e7\u0131k ve anla\u015f\u0131l\u0131r tutun. Karma\u015f\u0131k ileti\u015fim yollar\u0131n\u0131 belgeleyin.<br \/>\n*   <strong>Performans:<\/strong> Derinlemesine i\u00e7 i\u00e7e ge\u00e7mi\u015f yap\u0131lar, reaktivite g\u00fcncellemelerinin maliyetini art\u0131rabilir. Gereksiz g\u00fcncellemeleri \u00f6nlemek i\u00e7in <code>v-once<\/code>, <code>shallowRef<\/code>, <code>markRaw<\/code> gibi optimizasyon tekniklerini de\u011ferlendirin. \u00d6zellikle b\u00fcy\u00fck veri setleriyle \u00e7al\u0131\u015f\u0131rken <code>v-for<\/code> anahtarlar\u0131n\u0131 do\u011fru kullanmak hayati \u00f6nem ta\u015f\u0131r.<br \/>\n*   <strong>Test Edilebilirlik:<\/strong> Se\u00e7ti\u011finiz ileti\u015fim deseninin bile\u015fenlerinizi kolayca test edilebilir k\u0131ld\u0131\u011f\u0131ndan emin olun. Merkezi durum y\u00f6netimi ve composable&#8217;lar genellikle daha kolay test edilebilir bir yap\u0131 sunar.<br \/>\n*   <strong>Bellek Y\u00f6netimi:<\/strong> Event bus veya di\u011fer abonelik tabanl\u0131 sistemler kullan\u0131yorsan\u0131z, bile\u015fenler yok edildi\u011finde (unmounted) dinleyicileri veya abonelikleri temizlemeyi unutmay\u0131n (<code>onUnmounted<\/code> kancas\u0131 ile). Aksi takdirde bellek s\u0131z\u0131nt\u0131lar\u0131 ya\u015fanabilir.<br \/>\n*   <strong>Tek Y\u00f6nl\u00fc Veri Ak\u0131\u015f\u0131 Prensibi:<\/strong> M\u00fcmk\u00fcn oldu\u011funca Vue&#8217;nun tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131 prensibine ba\u011fl\u0131 kal\u0131n. <code>props<\/code> a\u015fa\u011f\u0131ya, <code>events<\/code> yukar\u0131ya. <code>provide\/inject<\/code> veya merkezi durum y\u00f6netimi bu prensibi daha b\u00fcy\u00fck \u00f6l\u00e7ekte koruman\u0131n yollar\u0131n\u0131 sunar.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Vue.js&#8217;te \u00f6zyinelemeli bile\u015fenler, hiyerar\u015fik verileri g\u00f6rselle\u015ftirmek ve y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Ancak, bu bile\u015fenler aras\u0131nda etkili ileti\u015fim kurmak, uygulaman\u0131n karma\u015f\u0131kl\u0131\u011f\u0131na ve \u00f6l\u00e7e\u011fine ba\u011fl\u0131 olarak farkl\u0131 yakla\u015f\u0131mlar gerektirebilir. Temel <code>props<\/code> ve <code>events<\/code> ikilisinden ba\u015flayarak, <code>provide\/inject<\/code> ile prop delme sorununu a\u015fabilir, event bus ile uzak bile\u015fenleri konu\u015fturabilir, Pinia veya Vuex ile merkezi bir durum y\u00f6netimi kurabilir ve Composition API ile esnek, yeniden kullan\u0131labilir \u00e7\u00f6z\u00fcmler geli\u015ftirebilirsiniz.<\/p>\n<p>En iyi ileti\u015fim deseni, uygulaman\u0131z\u0131n \u00f6zel ihtiya\u00e7lar\u0131na ve geli\u015ftirme ekibinizin tercihlerine g\u00f6re de\u011fi\u015fecektir. \u00d6nemli olan, se\u00e7ti\u011finiz yakla\u015f\u0131m\u0131n kodu okunabilir, bak\u0131m\u0131 kolay ve performansl\u0131 tutmas\u0131d\u0131r. Bu makalede ele al\u0131nan desenleri anlayarak, Vue.js&#8217;te \u00f6zyinelemeli bile\u015fenlerle \u00e7al\u0131\u015f\u0131rken kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131z ileti\u015fim zorluklar\u0131n\u0131n \u00fcstesinden gelmek i\u00e7in sa\u011flam bir temel olu\u015fturabilirsiniz.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Vue.js&#8217;te \u00d6zyinelemeli Bile\u015fenler Aras\u0131nda \u0130leti\u015fim Kurmak\nVue.js, bile\u015fen tabanl\u0131 mimarisiyle karma\u015f\u0131k kullan\u0131c\u0131 aray\u00fczlerini y\u00f6netmeyi","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-32557","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 \u00d6zyinelemeli Bile\u015fenler Aras\u0131nda \u0130leti\u015fim Kurmak - 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-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/\" \/>\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 \u00d6zyinelemeli Bile\u015fenler Aras\u0131nda \u0130leti\u015fim Kurmak\" \/>\n<meta property=\"og:description\" content=\"Vue.js&#039;te \u00d6zyinelemeli Bile\u015fenler Aras\u0131nda \u0130leti\u015fim Kurmak Vue.js, bile\u015fen tabanl\u0131 mimarisiyle karma\u015f\u0131k kullan\u0131c\u0131 aray\u00fczlerini y\u00f6netmeyi\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/vue-jste-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-23T04:41:17+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=\"16 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-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-jste-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Vue.js&#8217;te \u00d6zyinelemeli Bile\u015fenler Aras\u0131nda \u0130leti\u015fim Kurmak\",\"datePublished\":\"2025-10-23T04:41:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-jste-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/\"},\"wordCount\":2836,\"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-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-jste-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/vue-jste-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/\",\"name\":\"Vue.js'te \u00d6zyinelemeli Bile\u015fenler Aras\u0131nda \u0130leti\u015fim Kurmak - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-23T04:41:17+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-jste-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-jste-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-jste-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vue.js&#8217;te \u00d6zyinelemeli Bile\u015fenler Aras\u0131nda \u0130leti\u015fim Kurmak\"}]},{\"@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 \u00d6zyinelemeli Bile\u015fenler Aras\u0131nda \u0130leti\u015fim Kurmak - 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-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/","og_locale":"tr_TR","og_type":"article","og_title":"Vue.js'te \u00d6zyinelemeli Bile\u015fenler Aras\u0131nda \u0130leti\u015fim Kurmak","og_description":"Vue.js'te \u00d6zyinelemeli Bile\u015fenler Aras\u0131nda \u0130leti\u015fim Kurmak Vue.js, bile\u015fen tabanl\u0131 mimarisiyle karma\u015f\u0131k kullan\u0131c\u0131 aray\u00fczlerini y\u00f6netmeyi","og_url":"https:\/\/fatihsoysal.com\/blog\/vue-jste-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-23T04:41:17+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"16 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/vue-jste-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-jste-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Vue.js&#8217;te \u00d6zyinelemeli Bile\u015fenler Aras\u0131nda \u0130leti\u015fim Kurmak","datePublished":"2025-10-23T04:41:17+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-jste-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/"},"wordCount":2836,"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-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/vue-jste-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/","url":"https:\/\/fatihsoysal.com\/blog\/vue-jste-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/","name":"Vue.js'te \u00d6zyinelemeli Bile\u015fenler Aras\u0131nda \u0130leti\u015fim Kurmak - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-23T04:41:17+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-jste-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/vue-jste-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/vue-jste-ozyinelemeli-bilesenler-arasinda-iletisim-kurmak\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Vue.js&#8217;te \u00d6zyinelemeli Bile\u015fenler Aras\u0131nda \u0130leti\u015fim Kurmak"}]},{"@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\/32557","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=32557"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32557\/revisions"}],"predecessor-version":[{"id":32558,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32557\/revisions\/32558"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32557"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32557"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32557"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}