{"id":39454,"date":"2026-02-21T18:40:55","date_gmt":"2026-02-21T15:40:55","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=39454"},"modified":"2026-02-21T18:40:55","modified_gmt":"2026-02-21T15:40:55","slug":"vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/","title":{"rendered":"Vue.js Uygulaman\u0131z\u0131 Slots, Mixins ve Composition API ile DRY Hale Getirme"},"content":{"rendered":"<p><body><\/p>\n<h2>Vue.js Uygulaman\u0131z\u0131 Slots, Mixins ve Composition API ile DRY Hale Getirme<\/h2>\n<h2>Giri\u015f<\/h2>\n<p>Modern web geli\u015ftirme d\u00fcnyas\u0131nda, s\u00fcrd\u00fcr\u00fclebilir, bak\u0131m\u0131 kolay ve \u00f6l\u00e7eklenebilir uygulamalar olu\u015fturmak temel bir gerekliliktir. Bu hedeflere ula\u015fman\u0131n en \u00f6nemli prensiplerinden biri, &#8220;Don&#8217;t Repeat Yourself&#8221; (DRY) yani &#8220;Kendini Tekrar Etme&#8221; ilkesidir. DRY prensibi, bir sistemdeki her bilgi par\u00e7as\u0131n\u0131n, her i\u015flevselli\u011fin ve her mant\u0131\u011f\u0131n tek ve a\u00e7\u0131k bir temsiline sahip olmas\u0131 gerekti\u011fini savunur. Bu, kod tekrar\u0131n\u0131 en aza indirerek hatalar\u0131 azalt\u0131r, bak\u0131m\u0131 kolayla\u015ft\u0131r\u0131r ve geli\u015ftirme h\u0131z\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<p>Vue.js, bile\u015fen tabanl\u0131 yap\u0131s\u0131yla DRY prensibini uygulamak i\u00e7in m\u00fckemmel bir ortam sunar. Ancak, bile\u015fenler aras\u0131nda ortak UI yap\u0131lar\u0131, payla\u015f\u0131lan mant\u0131k veya veri y\u00f6netimi gibi durumlar ortaya \u00e7\u0131kt\u0131\u011f\u0131nda, bu prensibi uygulamak i\u00e7in \u00f6zel ara\u00e7lara ihtiya\u00e7 duyar\u0131z. Vue.js, bu ihtiyac\u0131 kar\u015f\u0131lamak \u00fczere \u00fc\u00e7 temel mekanizma sunar: Slots (Slotlar), Mixins (Mixinler) ve Composition API (Kompozisyon API&#8217;si).<\/p>\n<p>Bu makalede, Vue.js uygulamalar\u0131n\u0131z\u0131 daha DRY hale getirmek i\u00e7in bu \u00fc\u00e7 g\u00fc\u00e7l\u00fc arac\u0131 derinlemesine inceleyece\u011fiz. Her birinin ne oldu\u011funu, nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131, avantajlar\u0131n\u0131, dezavantajlar\u0131n\u0131 ve hangi senaryolarda tercih edilmesi gerekti\u011fini detayl\u0131 \u00f6rneklerle a\u00e7\u0131klayaca\u011f\u0131z. Amac\u0131m\u0131z, Vue.js geli\u015ftiricilerine, kod tekrar\u0131n\u0131 azaltma, mod\u00fclerli\u011fi art\u0131rma ve daha kaliteli uygulamalar olu\u015fturma konusunda kapsaml\u0131 bir rehber sunmakt\u0131r.<\/p>\n<h2>DRY Prensibi ve Vue.js<\/h2>\n<p>DRY prensibi, yaz\u0131l\u0131m geli\u015ftirmenin temel ta\u015flar\u0131ndan biridir. Bir kod taban\u0131nda ayn\u0131 mant\u0131\u011f\u0131n, ayn\u0131 UI eleman\u0131n\u0131n veya ayn\u0131 veri i\u015fleme s\u00fcrecinin birden fazla yerde tekrarlanmas\u0131, zamanla uygulaman\u0131n karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r, hata yapma olas\u0131l\u0131\u011f\u0131n\u0131 y\u00fckseltir ve de\u011fi\u015fiklik yapmay\u0131 kabusa \u00e7evirir. Vue.js gibi bile\u015fen tabanl\u0131 bir framework&#8217;te, bu prensibi uygulamak kritik \u00f6neme sahiptir.<\/p>\n<p>Vue.js uygulamalar\u0131nda kod tekrar\u0131 genellikle iki ana alanda ortaya \u00e7\u0131kar:<\/p>\n<p>1.  <strong>Tekrar Eden Kullan\u0131c\u0131 Aray\u00fcz\u00fc (UI) Elemanlar\u0131:<\/strong> Uygulaman\u0131zda s\u0131k\u00e7a kullan\u0131lan kartlar, modal pencereler, buton gruplar\u0131 veya layout yap\u0131lar\u0131 gibi g\u00f6rsel bile\u015fenler. Bu bile\u015fenlerin her seferinde s\u0131f\u0131rdan olu\u015fturulmas\u0131 veya kopyala-yap\u0131\u015ft\u0131r yap\u0131lmas\u0131, hem zaman kayb\u0131na yol a\u00e7ar hem de gelecekteki de\u011fi\u015fiklikleri zorla\u015ft\u0131r\u0131r.<br \/>\n2.  <strong>Tekrar Eden Mant\u0131k (Logic):<\/strong> API istekleri, form do\u011frulama, durum y\u00f6netimi, kullan\u0131c\u0131 etkile\u015fimleri veya belirli bir veri i\u015fleme s\u00fcreci gibi i\u015f mant\u0131\u011f\u0131. Bu mant\u0131\u011f\u0131n farkl\u0131 bile\u015fenlerde benzer \u015fekillerde uygulanmas\u0131, kod tekrar\u0131na ve tutars\u0131zl\u0131klara neden olabilir.<\/p>\n<p>DRY prensibini uygulayarak, bu tekrarlar\u0131 ortadan kald\u0131r\u0131r\u0131z. Bunun faydalar\u0131 \u015funlard\u0131r:<\/p>\n<p>*   <strong>Bak\u0131m Kolayl\u0131\u011f\u0131:<\/strong> Bir mant\u0131k veya UI eleman\u0131 tek bir yerde tan\u0131mland\u0131\u011f\u0131nda, \u00fczerinde yap\u0131lacak bir de\u011fi\u015fiklik sadece o tek noktada yap\u0131l\u0131r ve uygulaman\u0131n her yerine yans\u0131r.<br \/>\n*   <strong>Okunabilirlik:<\/strong> Daha az tekrar eden kod, daha temiz ve anla\u015f\u0131l\u0131r bir yap\u0131 sunar. Geli\u015ftiriciler, ilgili mant\u0131\u011f\u0131 veya UI&#8217;\u0131 tek bir yerden takip edebilir.<br \/>\n*   <strong>Geli\u015ftirme H\u0131z\u0131:<\/strong> Ortak bile\u015fenleri veya mant\u0131k par\u00e7alar\u0131n\u0131 yeniden kullanarak, yeni \u00f6zellikler geli\u015ftirme s\u00fcreci h\u0131zlan\u0131r.<br \/>\n*   <strong>Hata Azaltma:<\/strong> Ayn\u0131 mant\u0131\u011f\u0131n farkl\u0131 yerlerde farkl\u0131 \u015fekillerde uygulanmas\u0131, hata olas\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r. Tek bir merkezi yerden y\u00f6netildi\u011finde, hatalar daha kolay tespit edilir ve d\u00fczeltilir.<\/p>\n<p>Vue.js&#8217;in sundu\u011fu Slots, Mixins ve Composition API, bu hedeflere ula\u015fmak i\u00e7in geli\u015ftiricilere g\u00fc\u00e7l\u00fc ara\u00e7lar sa\u011flar. \u015eimdi bu ara\u00e7lar\u0131 s\u0131ras\u0131yla inceleyelim.<\/p>\n<h2>Slots ile Bile\u015fenleri Esnek Hale Getirme<\/h2>\n<p>Vue.js&#8217;teki slotlar, bir bile\u015fenin i\u00e7eri\u011fini dinamik olarak de\u011fi\u015ftirmemize olanak tan\u0131r. Ebeveyn bile\u015fenden \u00e7ocuk bile\u015fene HTML i\u00e7eri\u011fi veya di\u011fer bile\u015fenleri &#8220;ge\u00e7irmek&#8221; i\u00e7in kullan\u0131l\u0131rlar. Bu, genel bir iskelet veya sarmalay\u0131c\u0131 bile\u015fen olu\u015ftururken, i\u00e7eri\u011fin ebeveyn taraf\u0131ndan belirlenmesini sa\u011flayarak DRY prensibini UI katman\u0131nda uygulamam\u0131za yard\u0131mc\u0131 olur.<\/p>\n<h3>Slotlar Nedir?<\/h3>\n<p>Slotlar, bir bile\u015fenin \u015fablonunda yer tutucular tan\u0131mlaman\u0131n bir yoludur. Bir \u00e7ocuk bile\u015fenini kullan\u0131rken, ebeveyn bile\u015fen bu yer tutuculara kendi i\u00e7eri\u011fini enjekte edebilir. Bu, bile\u015fenin g\u00f6rsel yap\u0131s\u0131n\u0131 korurken, i\u00e7eri\u011fini \u00f6zelle\u015ftirmemizi sa\u011flar.<\/p>\n<p><strong>\u00d6rnek:<\/strong> Basit bir <code>Card<\/code> bile\u015feni d\u00fc\u015f\u00fcn\u00fcn. Kart\u0131n genel g\u00f6r\u00fcn\u00fcm\u00fc (kenarl\u0131k, g\u00f6lge vb.) ayn\u0131 kalacak, ancak ba\u015fl\u0131\u011f\u0131, g\u00f6vdesi ve altbilgisi her kart i\u00e7in farkl\u0131 olacakt\u0131r.<\/p>\n<p><strong><code>Card.vue<\/code>:<\/strong><\/p>\n<pre><code class=\"language-vue\"><template>\n  <div class=\"card\">\n    <div class=\"card-header\">\n      <slot name=\"header\">Varsay\u0131lan Ba\u015fl\u0131k<\/slot>\n    <\/div>\n    <div class=\"card-body\">\n      <slot>Varsay\u0131lan \u0130\u00e7erik<\/slot>\n    <\/div>\n    <div class=\"card-footer\">\n      <slot name=\"footer\">Varsay\u0131lan Altbilgi<\/slot>\n    <\/div>\n  <\/div>\n<\/template>\n\n<style scoped>\n.card {\n  border: 1px solid #ccc;\n  border-radius: 8px;\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n  margin: 16px;\n  width: 300px;\n  font-family: sans-serif;\n}\n.card-header {\n  padding: 12px;\n  background-color: #f0f0f0;\n  border-bottom: 1px solid #eee;\n  font-weight: bold;\n}\n.card-body {\n  padding: 12px;\n}\n.card-footer {\n  padding: 12px;\n  border-top: 1px solid #eee;\n  background-color: #f0f0f0;\n  font-size: 0.9em;\n  color: #666;\n}\n<\/style><\/code><\/pre>\n<h3>Adland\u0131r\u0131lm\u0131\u015f Slotlar (Named Slots)<\/h3>\n<p>Yukar\u0131daki <code>Card<\/code> \u00f6rne\u011finde g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, bir bile\u015fenin birden fazla slotu olabilir. Bu slotlara isim vererek, ebeveyn bile\u015fenin hangi i\u00e7eri\u011fi hangi slota yerle\u015ftirece\u011fini belirtmesini sa\u011flayabiliriz. Adland\u0131r\u0131lm\u0131\u015f slotlar, <code>name<\/code> \u00f6zelli\u011fi ile tan\u0131mlan\u0131r. Ebeveyn bile\u015fende, <code>v-slot:slotAdi<\/code> veya k\u0131saca <code>#slotAdi<\/code> direktifi ile i\u00e7eri\u011fi ilgili slota yerle\u015ftiririz.<\/p>\n<p><strong><code>App.vue<\/code> (Ebeveyn bile\u015fen):<\/strong><\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <Card>\n      <template #header>\n        <h3>\u00dcr\u00fcn Detay\u0131<\/h3>\n      <\/template>\n      <p>Bu, \u00fcr\u00fcn\u00fcn a\u00e7\u0131klamas\u0131d\u0131r. \u00c7ok kaliteli bir \u00fcr\u00fcn!<\/p>\n      <template #footer>\n        <button>Sepete Ekle<\/button>\n      <\/template>\n    <\/Card>\n\n    <Card>\n      <!-- Ba\u015fl\u0131k ve altbilgi slotlar\u0131 bo\u015f b\u0131rak\u0131ld\u0131\u011f\u0131nda varsay\u0131lan i\u00e7erik g\u00f6r\u00fcn\u00fcr -->\n      <p>Bu kart\u0131n sadece varsay\u0131lan i\u00e7eri\u011fi var.<\/p>\n    <\/Card>\n  <\/div>\n<\/template>\n\n<script setup>\nimport Card from '.\/components\/Card.vue';\n<\/script><\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>Card<\/code> bile\u015feninin genel yap\u0131s\u0131 korunurken, her bir kart \u00f6rne\u011fi farkl\u0131 ba\u015fl\u0131k, g\u00f6vde ve altbilgi i\u00e7eri\u011fine sahip olabilir. Bu, kart\u0131n UI yap\u0131s\u0131n\u0131 tekrar etmeden farkl\u0131 kart tipleri olu\u015fturmam\u0131z\u0131 sa\u011flar.<\/p>\n<h3>Scoped Slots (Kapsaml\u0131 Slotlar)<\/h3>\n<p>Bazen, \u00e7ocuk bile\u015fenin kendi i\u00e7indeki verilere dayanarak ebeveynin i\u00e7eri\u011fini render etmesi gerekebilir. \u0130\u015fte bu noktada kapsaml\u0131 slotlar devreye girer. Kapsaml\u0131 slotlar, \u00e7ocuk bile\u015fenin verilerini ebeveyn bile\u015fene &#8220;prop&#8221; olarak iletmesini ve ebeveynin bu verileri kullanarak slot i\u00e7eri\u011fini olu\u015fturmas\u0131n\u0131 sa\u011flar.<\/p>\n<p><strong>\u00d6rnek:<\/strong> Bir <code>ItemList<\/code> bile\u015feni d\u00fc\u015f\u00fcn\u00fcn. Bu bile\u015fen, bir liste verisini al\u0131r ve her bir \u00f6\u011feyi render etmek i\u00e7in kapsaml\u0131 bir slot kullan\u0131r. Ebeveyn bile\u015fen, her bir \u00f6\u011fenin nas\u0131l g\u00f6r\u00fcnece\u011fini belirler.<\/p>\n<p><strong><code>ItemList.vue<\/code>:<\/strong><\/p>\n<pre><code class=\"language-vue\"><template>\n  <ul>\n    <li v-for=\"item in items\" :key=\"item.id\">\n      <slot :item=\"item\" :index=\"items.indexOf(item)\">\n        <!-- Varsay\u0131lan i\u00e7erik: E\u011fer ebeveyn slot i\u00e7eri\u011fi sa\u011flamazsa bu g\u00f6r\u00fcn\u00fcr -->\n        {{ item.name }}\n      <\/slot>\n    <\/li>\n  <\/ul>\n<\/template>\n\n<script setup>\nimport { defineProps } from 'vue';\n\ndefineProps({\n  items: {\n    type: Array,\n    required: true\n  }\n});\n<\/script><\/code><\/pre>\n<p><strong><code>App.vue<\/code> (Ebeveyn bile\u015fen):<\/strong><\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <h2>\u00dcr\u00fcn Listesi<\/h2>\n    <ItemList :items=\"products\">\n      <template v-slot=\"{ item, index }\">\n        <div class=\"product-item\">\n          <span>{{ index + 1 }}. {{ item.name }}<\/span>\n          <strong>{{ item.price }} TL<\/strong>\n          <button @click=\"addToCart(item)\">Sepete Ekle<\/button>\n        <\/div>\n      <\/template>\n    <\/ItemList>\n\n    <h2>Kullan\u0131c\u0131 Listesi<\/h2>\n    <ItemList :items=\"users\">\n      <template #default=\"{ item }\">\n        <div class=\"user-item\">\n          <img :src=\"item.avatar\" alt=\"Avatar\" width=\"30\" height=\"30\" \/>\n          <span>{{ item.username }} ({{ item.role }})<\/span>\n        <\/div>\n      <\/template>\n    <\/ItemList>\n  <\/div>\n<\/template>\n\n<script setup>\nimport { ref } from 'vue';\nimport ItemList from '.\/components\/ItemList.vue';\n\nconst products = ref([\n  { id: 1, name: 'Laptop', price: 12000 },\n  { id: 2, name: 'Mouse', price: 250 },\n  { id: 3, name: 'Klavye', price: 700 }\n]);\n\nconst users = ref([\n  { id: 1, username: 'alice', role: 'Admin', avatar: 'https:\/\/i.pravatar.cc\/30?img=1' },\n  { id: 2, username: 'bob', role: 'Editor', avatar: 'https:\/\/i.pravatar.cc\/30?img=2' },\n]);\n\nconst addToCart = (product) => {\n  alert(<code>${product.name} sepete eklendi!<\/code>);\n};\n<\/script>\n\n<style scoped>\n.product-item, .user-item {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 8px 0;\n  border-bottom: 1px dotted #eee;\n}\n.product-item button {\n  margin-left: 10px;\n  padding: 5px 10px;\n  cursor: pointer;\n}\n.user-item img {\n  border-radius: 50%;\n  margin-right: 10px;\n}\n<\/style><\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>ItemList<\/code> bile\u015feni sadece veriyi y\u00f6netiyor ve her bir \u00f6\u011feyi render etme sorumlulu\u011funu ebeveyne b\u0131rak\u0131yor. Bu sayede, ayn\u0131 <code>ItemList<\/code> bile\u015fenini farkl\u0131 veri tipleri (\u00fcr\u00fcnler, kullan\u0131c\u0131lar vb.) i\u00e7in ve farkl\u0131 g\u00f6rsel sunumlarla kullanabiliriz, b\u00f6ylece UI tekrar\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde azalt\u0131r\u0131z.<\/p>\n<h3>Slot Kullan\u0131m Senaryolar\u0131 ve DRY \u0130li\u015fkisi<\/h3>\n<p>*   <strong>Ortak Layout&#8217;lar:<\/strong> Sayfa d\u00fczenleri, panel bile\u015fenleri veya genel sarmalay\u0131c\u0131lar olu\u015ftururken, i\u00e7eri\u011fin dinamik olarak de\u011fi\u015fmesini sa\u011flamak i\u00e7in slotlar idealdir.<br \/>\n*   <strong>Genel Bile\u015fen \u0130skeletleri:<\/strong> <code>Card<\/code>, <code>Modal<\/code>, <code>Accordion<\/code> gibi bile\u015fenlerin temel yap\u0131s\u0131n\u0131 tan\u0131mlay\u0131p, i\u00e7eriklerini \u00f6zelle\u015ftirmek.<br \/>\n*   <strong>\u00d6zelle\u015ftirilebilir \u0130\u00e7erik Alanlar\u0131:<\/strong> \u00d6zellikle liste veya tablo gibi veri tabanl\u0131 bile\u015fenlerde, her bir \u00f6\u011fenin nas\u0131l render edilece\u011fini ebeveyne b\u0131rakarak esneklik sa\u011flamak.<br \/>\n*   <strong>Form Elemanlar\u0131:<\/strong> Genel bir form alan\u0131 bile\u015feni olu\u015fturup, input, select veya textarea gibi farkl\u0131 form elemanlar\u0131n\u0131 slotlar arac\u0131l\u0131\u011f\u0131yla enjekte etmek.<\/p>\n<p>Slotlar, bile\u015fenlerin g\u00f6rsel yap\u0131s\u0131n\u0131 yeniden kullan\u0131rken, i\u00e7eriklerini esnek bir \u015fekilde de\u011fi\u015ftirmemizi sa\u011flayarak Vue.js uygulamalar\u0131m\u0131zda UI katman\u0131ndaki DRY prensibini g\u00fc\u00e7lendirir.<\/p>\n<h2>Mixins ile Mant\u0131\u011f\u0131 Yeniden Kullanma<\/h2>\n<p>Mixins, Vue.js&#8217;in Option API&#8217;si (Se\u00e7enek API&#8217;si) ile ortak bile\u015fen i\u015flevselli\u011fini da\u011f\u0131tmak i\u00e7in kullan\u0131lan bir y\u00f6ntemdir. Bir mixin nesnesi, herhangi bir bile\u015fen se\u00e7ene\u011fini (data, methods, computed, lifecycle hooks vb.) i\u00e7erebilir. Bir bile\u015fen bir mixin kulland\u0131\u011f\u0131nda, mixin&#8217;deki t\u00fcm se\u00e7enekler bile\u015fenin kendi se\u00e7enekleriyle birle\u015ftirilir.<\/p>\n<h3>Mixins Nedir?<\/h3>\n<p>Mixins, birden fazla bile\u015fen aras\u0131nda payla\u015f\u0131lan i\u015flevselli\u011fi, veriyi veya ya\u015fam d\u00f6ng\u00fcs\u00fc kancalar\u0131n\u0131 soyutlaman\u0131n ve yeniden kullanman\u0131n bir yoludur. Temelde, bir mixin, bir Vue bile\u015feninin se\u00e7eneklerini (options) tan\u0131mlayan bir JavaScript nesnesidir. Bir bile\u015fen bu mixini i\u00e7e aktard\u0131\u011f\u0131nda, mixin&#8217;deki se\u00e7enekler bile\u015fenin kendi se\u00e7enekleriyle &#8220;kar\u0131\u015ft\u0131r\u0131l\u0131r&#8221; (merge edilir).<\/p>\n<p><strong>\u00d6rnek:<\/strong> Bir API&#8217;den veri getirme ve y\u00fcklenme durumunu y\u00f6netme mant\u0131\u011f\u0131n\u0131 bir\u00e7ok bile\u015fende kullanmak isteyebiliriz.<\/p>\n<p><strong><code>fetchDataMixin.js<\/code>:<\/strong><\/p>\n<pre><code class=\"language-javascript\">import { ref, onMounted } from 'vue'; \/\/ Vue 3 i\u00e7in ref ve onMounted kullan\u0131yoruz\n\nexport const fetchDataMixin = {\n  data() {\n    return {\n      isLoading: false,\n      error: null,\n      data: null\n    };\n  },\n  methods: {\n    async fetchData(url) {\n      this.isLoading = true;\n      this.error = null;\n      try {\n        const response = await fetch(url);\n        if (!response.ok) {\n          throw new Error(<code>HTTP error! Status: ${response.status}<\/code>);\n        }\n        this.data = await response.json();\n      } catch (err) {\n        this.error = err.message;\n      } finally {\n        this.isLoading = false;\n      }\n    }\n  }\n  \/\/ Vue 3'te mixin i\u00e7inde onMounted kullanmak i\u00e7in setup() i\u00e7inde \u00e7a\u011f\u0131rmak gerekir\n  \/\/ Ancak Option API mixin'leri genellikle data, methods vb. i\u00e7in kullan\u0131l\u0131r.\n  \/\/ Lifecycle hook'lar\u0131 do\u011frudan Option API'de tan\u0131mlanabilir:\n  \/\/ created() {\n  \/\/   console.log('Mixin created hook called');\n  \/\/ }\n};<\/code><\/pre>\n<h3>Mixins Kullan\u0131m\u0131<\/h3>\n<p>Bir mixini bir bile\u015fene dahil etmek i\u00e7in, bile\u015fenin <code>mixins<\/code> se\u00e7ene\u011fini kullan\u0131r\u0131z. Bu se\u00e7enek, mixin nesnelerinin bir dizisini al\u0131r.<\/p>\n<p><strong><code>UserList.vue<\/code> (Option API ile):<\/strong><\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <h3>Kullan\u0131c\u0131lar (Mixin ile)<\/h3>\n    <div v-if=\"isLoading\">Y\u00fckleniyor...<\/div>\n    <div v-else-if=\"error\">Hata: {{ error }}<\/div>\n    <ul v-else-if=\"data\">\n      <li v-for=\"user in data\" :key=\"user.id\">{{ user.name }} ({{ user.email }})<\/li>\n    <\/ul>\n    <button @click=\"fetchData('https:\/\/jsonplaceholder.typicode.com\/users')\">Kullan\u0131c\u0131lar\u0131 Yenile<\/button>\n  <\/div>\n<\/template>\n\n<script>\nimport { fetchDataMixin } from '.\/fetchDataMixin';\n\nexport default {\n  mixins: [fetchDataMixin],\n  mounted() {\n    this.fetchData('https:\/\/jsonplaceholder.typicode.com\/users');\n  }\n};\n<\/script><\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>UserList<\/code> bile\u015feni <code>fetchDataMixin<\/code>&#8216;i kullanarak <code>isLoading<\/code>, <code>error<\/code>, <code>data<\/code> ve <code>fetchData<\/code> metodunu kendi b\u00fcnyesine dahil eder. Bu sayede, veri getirme mant\u0131\u011f\u0131n\u0131 her bile\u015fende yeniden yazmak yerine, merkezi bir yerden y\u00f6netebiliriz.<\/p>\n<h3>Mixins&#8217;in Avantajlar\u0131<\/h3>\n<p>*   <strong>Kod Tekrar\u0131n\u0131 Azaltma:<\/strong> Ortak mant\u0131\u011f\u0131 tek bir yerde tan\u0131mlayarak, birden fazla bile\u015fende tekrar eden kodu \u00f6nler.<br \/>\n*   <strong>Mod\u00fclerlik:<\/strong> \u0130\u015flevselli\u011fi k\u00fc\u00e7\u00fck, odaklanm\u0131\u015f par\u00e7alara ay\u0131r\u0131r.<br \/>\n*   <strong>Kolay Kullan\u0131m:<\/strong> \u00d6zellikle Option API ile yaz\u0131lm\u0131\u015f eski Vue 2 projelerinde, h\u0131zl\u0131 bir \u015fekilde ortak i\u015flevsellik eklemek i\u00e7in basittir.<\/p>\n<h3>Mixins&#8217;in Dezavantajlar\u0131 ve Potansiyel Sorunlar\u0131<\/h3>\n<p>Mixins, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda baz\u0131 sorunlara yol a\u00e7abilir:<\/p>\n<p>*   <strong>Global \u0130sim \u00c7ak\u0131\u015fmalar\u0131 (Name Collisions):<\/strong> Mixin&#8217;deki ve bile\u015fendeki ayn\u0131 isimli <code>data<\/code> \u00f6zellikleri veya <code>methods<\/code>, birbirlerinin \u00fczerine yazabilir. Bu, beklenmedik davran\u0131\u015flara yol a\u00e7abilir ve hata ay\u0131klamay\u0131 zorla\u015ft\u0131r\u0131r. Hangi de\u011ferin veya metodun nereden geldi\u011fini anlamak g\u00fc\u00e7le\u015fir.<br \/>\n*   <strong>\u00d6rt\u00fck Ba\u011f\u0131ml\u0131l\u0131klar (Implicit Dependencies):<\/strong> Bir mixin, bile\u015fenin di\u011fer \u00f6zelliklerine (\u00f6rne\u011fin, belirli bir <code>data<\/code> \u00f6zelli\u011finin varl\u0131\u011f\u0131na) ba\u011fl\u0131 olabilir. Bu ba\u011f\u0131ml\u0131l\u0131klar a\u00e7\u0131k\u00e7a belirtilmedi\u011fi i\u00e7in, mixin&#8217;i kullanan bir bile\u015fenin bu gereksinimleri kar\u015f\u0131lamad\u0131\u011f\u0131nda hatalara yol a\u00e7abilir.<br \/>\n*   <strong>Bak\u0131m Zorlu\u011fu:<\/strong> Bir bile\u015fenin birden fazla mixin kullanmas\u0131 durumunda, bile\u015fenin davran\u0131\u015f\u0131n\u0131 anlamak zorla\u015f\u0131r. Hangi metodun veya verinin hangi mixin&#8217;den geldi\u011fini takip etmek karma\u015f\u0131k hale gelebilir (&#8220;mixin hell&#8221;).<br \/>\n*   <strong>TypeScript ile Zorluklar:<\/strong> Mixins, TypeScript ile iyi bir entegrasyon sa\u011flamaz. Tip \u00e7\u0131kar\u0131m\u0131 zay\u0131ft\u0131r ve mixin&#8217;lerden gelen tipleri do\u011fru bir \u015fekilde tan\u0131mlamak zor olabilir. Bu, b\u00fcy\u00fck \u00f6l\u00e7ekli ve tip g\u00fcvenli\u011finin \u00f6nemli oldu\u011fu projelerde sorun yarat\u0131r.<br \/>\n*   <strong>Payla\u015f\u0131lan Durum (Shared State):<\/strong> Mixin&#8217;ler genellikle durumsuz (stateless) olmal\u0131d\u0131r. E\u011fer bir mixin i\u00e7inde de\u011fi\u015ftirilebilir bir durum varsa ve birden fazla bile\u015fen bu mixini kullan\u0131yorsa, durumun payla\u015f\u0131lmas\u0131 ve beklenmeyen yan etkiler ortaya \u00e7\u0131kabilir. Her mixin, kendi veri kopyas\u0131n\u0131 al\u0131r, ancak bu, bir mixin&#8217;in di\u011fer mixin&#8217;ler veya bile\u015fenlerle etkile\u015fimini karma\u015f\u0131kla\u015ft\u0131rabilir.<\/p>\n<p>Bu dezavantajlar nedeniyle, Vue 3 ile birlikte tan\u0131t\u0131lan Composition API, mixin&#8217;lere k\u0131yasla daha g\u00fc\u00e7l\u00fc ve tercih edilen bir alternatif haline gelmi\u015ftir.<\/p>\n<h2>Composition API ile Daha G\u00fc\u00e7l\u00fc ve Okunabilir Kod<\/h2>\n<p>Vue 3&#8217;\u00fcn en \u00f6nemli yeniliklerinden biri olan Composition API, bile\u015fen mant\u0131\u011f\u0131n\u0131 organize etme ve yeniden kullanma \u015feklimizi k\u00f6kten de\u011fi\u015ftirmi\u015ftir. \u00d6zellikle karma\u015f\u0131k bile\u015fenlerde veya payla\u015f\u0131lan i\u015flevselliklerde mixin&#8217;lerin getirdi\u011fi sorunlara \u00e7\u00f6z\u00fcm sunar.<\/p>\n<h3>Composition API Nedir?<\/h3>\n<p>Composition API, Vue bile\u015fen mant\u0131\u011f\u0131n\u0131 <code>options<\/code> (data, methods, computed vb.) yerine, ilgili \u00f6zelliklere g\u00f6re d\u00fczenlememizi sa\u011flayan bir dizi API&#8217;dir. Temel olarak, bir bile\u015fenin mant\u0131\u011f\u0131n\u0131, bile\u015fenin kendisinden ayr\u0131 olarak, yeniden kullan\u0131labilir &#8220;composable&#8221; fonksiyonlara ay\u0131rmam\u0131z\u0131 sa\u011flar. Bu, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k bile\u015fenlerde, ilgili mant\u0131\u011f\u0131n kod taban\u0131nda da birbirine yak\u0131n olmas\u0131n\u0131 sa\u011flayarak okunabilirli\u011fi ve bak\u0131m\u0131 art\u0131r\u0131r.<\/p>\n<p>Composition API&#8217;nin kalbinde <code>setup()<\/code> fonksiyonu yer al\u0131r. Bu fonksiyon, bile\u015fen olu\u015fturulmadan \u00f6nce \u00e7al\u0131\u015f\u0131r ve reaktif durum, hesaplanm\u0131\u015f \u00f6zellikler, izleyiciler ve metotlar gibi t\u00fcm Composition API \u00f6zelliklerini tan\u0131mlad\u0131\u011f\u0131m\u0131z yerdir. <code>setup()<\/code> i\u00e7inden d\u00f6nd\u00fcr\u00fclen her \u015fey, bile\u015fenin \u015fablonunda veya di\u011fer se\u00e7eneklerinde kullan\u0131labilir hale gelir.<\/p>\n<h3>Reaktiflik Temelleri<\/h3>\n<p>Composition API ile reaktif durum olu\u015fturmak i\u00e7in <code>ref<\/code> ve <code>reactive<\/code> kullan\u0131l\u0131r:<\/p>\n<p>*   <strong><code>ref<\/code>:<\/strong> Herhangi bir de\u011feri (ilkel veya nesne) reaktif hale getirmek i\u00e7in kullan\u0131l\u0131r. De\u011fere eri\u015fmek veya de\u011fi\u015ftirmek i\u00e7in <code>.value<\/code> \u00f6zelli\u011fini kullan\u0131r\u0131z.<\/p>\n<pre><code class=\"language-javascript\">import { ref } from 'vue';\n    const count = ref(0);\n    console.log(count.value); \/\/ 0\n    count.value++; \/\/ 1<\/code><\/pre>\n<p>*   <strong><code>reactive<\/code>:<\/strong> Yaln\u0131zca nesneleri reaktif hale getirmek i\u00e7in kullan\u0131l\u0131r. Do\u011frudan nesnenin \u00f6zelliklerine eri\u015fir veya de\u011fi\u015ftiririz.<\/p>\n<pre><code class=\"language-javascript\">import { reactive } from 'vue';\n    const state = reactive({ count: 0, name: 'Vue' });\n    console.log(state.count); \/\/ 0\n    state.count++; \/\/ 1<\/code><\/pre>\n<p>*   <strong><code>computed<\/code>:<\/strong> Reaktif verilere dayal\u0131 olarak hesaplanan ve \u00f6nbelle\u011fe al\u0131nan de\u011ferler olu\u015fturmak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-javascript\">import { ref, computed } from 'vue';\n    const price = ref(10);\n    const quantity = ref(2);\n    const totalPrice = computed(() => price.value * quantity.value);\n    \/\/ totalPrice, price veya quantity de\u011fi\u015fti\u011finde otomatik olarak g\u00fcncellenir.<\/code><\/pre>\n<p>*   <strong><code>watch<\/code>:<\/strong> Reaktif durumdaki de\u011fi\u015fiklikleri izlemek ve yan etkiler ger\u00e7ekle\u015ftirmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-javascript\">import { ref, watch } from 'vue';\n    const searchTerm = ref('');\n    watch(searchTerm, (newValue, oldValue) => {\n      console.log(<code>Arama terimi de\u011fi\u015fti: ${oldValue} -> ${newValue}<\/code>);\n      \/\/ API \u00e7a\u011fr\u0131s\u0131 yapabiliriz\n    });<\/code><\/pre>\n<p>*   <strong><code>toRefs<\/code> ve <code>toRef<\/code>:<\/strong> <code>reactive<\/code> bir nesnenin \u00f6zelliklerini, reaktifli\u011fini koruyarak tek tek <code>ref<\/code>&#8216;lere d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in kullan\u0131l\u0131r. Bu, <code>reactive<\/code> nesnelerden gelen \u00f6zellikleri yap\u0131bozum (destructuring) yaparken reaktifli\u011fi kaybetmemizi engeller.<\/p>\n<h3>Reusable Logic: Composables<\/h3>\n<p>Composition API&#8217;nin DRY prensibini uygulamadaki en b\u00fcy\u00fck g\u00fcc\u00fc, &#8220;Composables&#8221; ad\u0131 verilen yeniden kullan\u0131labilir fonksiyonlard\u0131r. Bir composable, temel olarak <code>setup()<\/code> fonksiyonunda yapabilece\u011fimiz herhangi bir Composition API mant\u0131\u011f\u0131n\u0131 i\u00e7eren bir JavaScript fonksiyonudur. Bu fonksiyonlar genellikle <code>use<\/code> \u00f6nekiyle adland\u0131r\u0131l\u0131r (\u00f6rne\u011fin, <code>useMousePosition<\/code>, <code>useFormValidation<\/code>).<\/p>\n<p><strong>\u00d6rnek:<\/strong> \u00d6nceki mixin \u00f6rne\u011findeki veri getirme mant\u0131\u011f\u0131n\u0131 bir composable olarak yeniden yazal\u0131m.<\/p>\n<p><strong><code>useFetch.js<\/code>:<\/strong><\/p>\n<pre><code class=\"language-javascript\">import { ref, watchEffect } from 'vue';\n\nexport function useFetch(url) {\n  const data = ref(null);\n  const error = ref(null);\n  const isLoading = ref(true);\n\n  async function doFetch() {\n    isLoading.value = true;\n    error.value = null;\n    data.value = null; \/\/ \u00d6nceki veriyi temizle\n    try {\n      const response = await fetch(url.value); \/\/ url bir ref olabilece\u011fi i\u00e7in .value kullan\u0131r\u0131z\n      if (!response.ok) {\n        throw new Error(<code>HTTP error! Status: ${response.status}<\/code>);\n      }\n      data.value = await response.json();\n    } catch (err) {\n      error.value = err.message;\n    } finally {\n      isLoading.value = false;\n    }\n  }\n\n  \/\/ url de\u011fi\u015fti\u011finde otomatik olarak doFetch'i \u00e7a\u011f\u0131r\n  watchEffect(() => {\n    if (url.value) { \/\/ url'in tan\u0131ml\u0131 oldu\u011fundan emin ol\n      doFetch();\n    }\n  });\n\n  return { data, error, isLoading, doFetch };\n}<\/code><\/pre>\n<p><strong><code>UserList.vue<\/code> (Composition API ile):<\/strong><\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <h3>Kullan\u0131c\u0131lar (Composable ile)<\/h3>\n    <div v-if=\"isLoading\">Y\u00fckleniyor...<\/div>\n    <div v-else-if=\"error\">Hata: {{ error }}<\/div>\n    <ul v-else-if=\"data\">\n      <li v-for=\"user in data\" :key=\"user.id\">{{ user.name }} ({{ user.email }})<\/li>\n    <\/ul>\n    <button @click=\"refreshUsers\">Kullan\u0131c\u0131lar\u0131 Yenile<\/button>\n  <\/div>\n<\/template>\n\n<script setup>\nimport { ref } from 'vue';\nimport { useFetch } from '.\/useFetch';\n\nconst userApiUrl = ref('https:\/\/jsonplaceholder.typicode.com\/users');\nconst { data, error, isLoading, doFetch } = useFetch(userApiUrl);\n\nconst refreshUsers = () => {\n  \/\/ useFetch i\u00e7indeki watchEffect sayesinde url de\u011fi\u015fti\u011finde otomatik olarak fetch yap\u0131l\u0131r.\n  \/\/ Ancak do\u011frudan doFetch metodunu da \u00e7a\u011f\u0131rabiliriz e\u011fer url de\u011fi\u015fmiyorsa.\n  doFetch();\n};\n<\/script><\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>useFetch<\/code> composable&#8217;\u0131, veri getirme mant\u0131\u011f\u0131n\u0131 soyutlar ve <code>UserList<\/code> bile\u015feni bu mant\u0131\u011f\u0131 temiz ve a\u00e7\u0131k bir \u015fekilde kullan\u0131r.<\/p>\n<h3>Composition API&#8217;nin Avantajlar\u0131<\/h3>\n<p>*   <strong>Mant\u0131\u011f\u0131 Daha \u0130yi Organize Etme (Logic Co-location):<\/strong> \u0130lgili mant\u0131k par\u00e7alar\u0131 (\u00f6rne\u011fin, bir formun do\u011frulama mant\u0131\u011f\u0131, g\u00f6nderim mant\u0131\u011f\u0131) tek bir yerde toplanabilir. Option API&#8217;de bu mant\u0131k <code>data<\/code>, <code>methods<\/code>, <code>computed<\/code> gibi farkl\u0131 se\u00e7eneklere da\u011f\u0131l\u0131yordu.<br \/>\n*   <strong>Daha \u0130yi Tip Deste\u011fi (TypeScript):<\/strong> Composition API, TypeScript ile m\u00fckemmel bir \u015fekilde \u00e7al\u0131\u015f\u0131r. Composables, tip \u00e7\u0131kar\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r ve tip g\u00fcvenli\u011fini art\u0131r\u0131r.<br \/>\n*   <strong>Daha Az \u0130sim \u00c7ak\u0131\u015fmas\u0131 Riski:<\/strong> Composables, fonksiyonlar oldu\u011fu i\u00e7in, d\u00f6nd\u00fcr\u00fclen de\u011ferlerin isimlerini istedi\u011fimiz gibi de\u011fi\u015ftirebiliriz (\u00f6rne\u011fin, <code>const { data: userData } = useFetch(...)<\/code>). Bu, mixin&#8217;lerdeki isim \u00e7ak\u0131\u015fmas\u0131 sorununu ortadan kald\u0131r\u0131r.<br \/>\n*   <strong>Daha Okunabilir ve Bak\u0131m\u0131 Kolay Kod:<\/strong> \u00d6zellikle b\u00fcy\u00fck bile\u015fenlerde, ilgili mant\u0131\u011f\u0131n tek bir yerde olmas\u0131, kodu daha anla\u015f\u0131l\u0131r ve bak\u0131m\u0131 daha kolay hale getirir.<br \/>\n*   <strong>Daha Esnek Yeniden Kullan\u0131labilirlik:<\/strong> Composables, fonksiyonlar oldu\u011fu i\u00e7in, ba\u011f\u0131ml\u0131l\u0131klar\u0131 a\u00e7\u0131k\u00e7a tan\u0131mlanabilir ve farkl\u0131 senaryolara daha kolay adapte edilebilir.<\/p>\n<h3>Composition API&#8217;nin Mixins&#8217;e G\u00f6re \u00dcst\u00fcnl\u00fckleri<\/h3>\n<p>*   <strong>A\u00e7\u0131k Ba\u011f\u0131ml\u0131l\u0131klar:<\/strong> Composables, hangi reaktif durumlar\u0131 veya di\u011fer composable&#8217;lar\u0131 kulland\u0131\u011f\u0131n\u0131 a\u00e7\u0131k\u00e7a belirtir. Mixin&#8217;lerde bu ba\u011f\u0131ml\u0131l\u0131klar \u00f6rt\u00fckt\u00fcr.<br \/>\n*   <strong>Daha \u0130yi Tip \u00c7\u0131kar\u0131m\u0131:<\/strong> TypeScript ile kullan\u0131ld\u0131\u011f\u0131nda, composables daha do\u011fru ve g\u00fcvenilir tip \u00e7\u0131kar\u0131m\u0131 sa\u011flar, bu da hata yakalamay\u0131 kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Kapsam Kontrol\u00fc:<\/strong> Composables, fonksiyonlar oldu\u011fu i\u00e7in kendi kapsamlar\u0131na sahiptir. Bu, mixin&#8217;lerdeki global isim \u00e7ak\u0131\u015fmas\u0131 riskini ortadan kald\u0131r\u0131r.<br \/>\n*   <strong>Esneklik:<\/strong> Composables, bir bile\u015fenin sadece belirli bir k\u0131sm\u0131nda kullan\u0131labilirken, mixin&#8217;ler genellikle t\u00fcm bile\u015fen se\u00e7eneklerini etkiler.<\/p>\n<p>Composition API, Vue.js&#8217;te DRY prensibini uygulamak i\u00e7in modern ve g\u00fc\u00e7l\u00fc bir yakla\u015f\u0131md\u0131r. \u00d6zellikle yeni projelerde veya mevcut projelerde karma\u015f\u0131k mant\u0131k tekrar\u0131n\u0131 ele al\u0131rken tercih edilmesi gereken y\u00f6ntemdir.<\/p>\n<h2>Hangi Yakla\u015f\u0131m\u0131 Ne Zaman Kullanmal\u0131?<\/h2>\n<p>Slots, Mixins ve Composition API&#8217;nin her biri, Vue.js uygulaman\u0131zda DRY prensibini uygulamak i\u00e7in farkl\u0131 senaryolara uygun ara\u00e7lard\u0131r. Do\u011fru arac\u0131 do\u011fru zamanda kullanmak, uygulaman\u0131z\u0131n kalitesini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131racakt\u0131r.<\/p>\n<p>1.  <strong>Slots (Slotlar): Bile\u015fenlerin \u0130\u00e7eri\u011fini veya G\u00f6rsel Yap\u0131s\u0131n\u0131 \u00d6zelle\u015ftirmek \u0130\u00e7in<\/strong><br \/>\n    *   <strong>Ne zaman kullan\u0131l\u0131r?<\/strong><br \/>\n        *   Bir bile\u015fenin genel bir iskeletini veya sarmalay\u0131c\u0131s\u0131n\u0131 olu\u015fturup, i\u00e7eri\u011finin ebeveyn taraf\u0131ndan dinamik olarak sa\u011flanmas\u0131n\u0131 istedi\u011finizde (\u00f6rne\u011fin, <code>Card<\/code>, <code>Modal<\/code>, <code>Layout<\/code> bile\u015fenleri).<br \/>\n        *   Liste veya tablo gibi veri tabanl\u0131 bile\u015fenlerde, her bir \u00f6\u011fenin nas\u0131l render edilece\u011fini ebeveynin belirlemesini istedi\u011finizde (scoped slots).<br \/>\n        *   UI katman\u0131nda kod tekrar\u0131n\u0131 \u00f6nlemek ve bile\u015fenleri daha esnek hale getirmek istedi\u011finizde.<br \/>\n    <em>   <strong>\u00d6zetle:<\/strong> UI&#8217;\u0131n <\/em>yap\u0131s\u0131<em> ayn\u0131 kalacak, ancak <\/em>i\u00e7eri\u011fi<em> veya <\/em>nas\u0131l g\u00f6r\u00fcnd\u00fc\u011f\u00fc* de\u011fi\u015fecekse slotlar\u0131 kullan\u0131n.<\/p>\n<p>2.  <strong>Mixins (Mixinler): K\u00fc\u00e7\u00fck, Ba\u011f\u0131ms\u0131z Mant\u0131k Par\u00e7alar\u0131n\u0131 Payla\u015fmak \u0130\u00e7in (Ancak Composition API Tercih Edilir)<\/strong><br \/>\n    *   <strong>Ne zaman kullan\u0131l\u0131r?<\/strong><br \/>\n        *   Vue 2 projelerinde, Option API ile yaz\u0131lm\u0131\u015f ve k\u00fc\u00e7\u00fck, ba\u011f\u0131ms\u0131z, genel <code>data<\/code>, <code>methods<\/code>, <code>computed<\/code> veya <code>lifecycle hooks<\/code> par\u00e7alar\u0131n\u0131 birden fazla bile\u015fen aras\u0131nda payla\u015fman\u0131z gerekti\u011finde.<br \/>\n        *   \u00c7ok basit ve isim \u00e7ak\u0131\u015fmas\u0131 riski d\u00fc\u015f\u00fck olan durumlarda.<br \/>\n    *   <strong>Ne zaman dikkatli olunmal\u0131?<\/strong><br \/>\n        *   Karma\u015f\u0131k mant\u0131k payla\u015f\u0131mlar\u0131nda veya birden fazla mixin kullan\u0131ld\u0131\u011f\u0131nda, isim \u00e7ak\u0131\u015fmalar\u0131 ve \u00f6rt\u00fck ba\u011f\u0131ml\u0131l\u0131klar nedeniyle sorunlar ya\u015fanabilir.<br \/>\n        *   Vue 3 ve yeni projelerde, mixin&#8217;ler yerine genellikle Composition API (Composables) tercih edilmelidir. Mixin&#8217;ler, Composition API&#8217;nin sa\u011flad\u0131\u011f\u0131 netli\u011fi ve esnekli\u011fi sunmaz.<br \/>\n    *   <strong>\u00d6zetle:<\/strong> Tarihi Vue 2 projelerinde basit i\u015flevsellikler i\u00e7in d\u00fc\u015f\u00fcn\u00fclebilir, ancak Vue 3&#8217;te Composition API varken pek \u00f6nerilmez.<\/p>\n<p>3.  <strong>Composition API (Composables): Karma\u015f\u0131k Mant\u0131\u011f\u0131 Yeniden Kullanmak ve Organize Etmek \u0130\u00e7in (Tercih Edilen Y\u00f6ntem)<\/strong><br \/>\n    *   <strong>Ne zaman kullan\u0131l\u0131r?<\/strong><br \/>\n        *   Karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131n\u0131 (API \u00e7a\u011fr\u0131lar\u0131, form do\u011frulama, durum y\u00f6netimi, kullan\u0131c\u0131 etkile\u015fimleri vb.) birden fazla bile\u015fen aras\u0131nda payla\u015fman\u0131z gerekti\u011finde.<br \/>\n        *   \u0130lgili mant\u0131\u011f\u0131 tek bir yerde gruplayarak bile\u015fen kodunu daha d\u00fczenli ve okunabilir hale getirmek istedi\u011finizde (logic co-location).<br \/>\n        *   TypeScript ile tip g\u00fcvenli\u011fini ve geli\u015ftirici deneyimini art\u0131rmak istedi\u011finizde.<br \/>\n        *   B\u00fcy\u00fck ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirirken.<br \/>\n        *   Mixins&#8217;in getirdi\u011fi isim \u00e7ak\u0131\u015fmas\u0131, \u00f6rt\u00fck ba\u011f\u0131ml\u0131l\u0131k ve bak\u0131m zorlu\u011fu gibi sorunlardan ka\u00e7\u0131nmak istedi\u011finizde.<br \/>\n    <em>   <strong>\u00d6zetle:<\/strong> Uygulaman\u0131zdaki <\/em>i\u015f mant\u0131\u011f\u0131* tekrar\u0131n\u0131 \u00f6nlemek, kodunuzu mod\u00fcler hale getirmek ve gelece\u011fe d\u00f6n\u00fck bir yap\u0131 kurmak istedi\u011finizde Composition API ve composable&#8217;lar\u0131 kullan\u0131n. Bu, Vue 3&#8217;teki en modern ve g\u00fc\u00e7l\u00fc yakla\u015f\u0131md\u0131r.<\/p>\n<p><strong>Genel Kural:<\/strong><\/p>\n<p>*   <strong>UI yap\u0131s\u0131<\/strong> i\u00e7in <strong>Slots<\/strong> kullan\u0131n.<br \/>\n*   <strong>\u0130\u015f mant\u0131\u011f\u0131<\/strong> i\u00e7in <strong>Composition API (Composables)<\/strong> kullan\u0131n.<br \/>\n*   <strong>Mixins<\/strong>, \u00e7o\u011fu senaryoda Composition API&#8217;nin daha iyi bir alternatif oldu\u011fu eski bir yakla\u015f\u0131md\u0131r.<\/p>\n<h2>En \u0130yi Uygulamalar ve \u0130pu\u00e7lar\u0131<\/h2>\n<p>DRY prensibini Vue.js&#8217;te bu ara\u00e7larla uygularken ak\u0131lda tutulmas\u0131 gereken baz\u0131 en iyi uygulamalar ve ipu\u00e7lar\u0131:<\/p>\n<p>1.  <strong>Her Zaman En Basit \u00c7\u00f6z\u00fcm\u00fc Aray\u0131n:<\/strong> Kodu genelle\u015ftirmeye veya soyutlamaya ba\u015flamadan \u00f6nce, ger\u00e7ekten bir tekrar olup olmad\u0131\u011f\u0131n\u0131 ve bu tekrar\u0131n gelecekte sorun yarat\u0131p yaratmayaca\u011f\u0131n\u0131 de\u011ferlendirin. Bazen, k\u00fc\u00e7\u00fck bir tekrar kabul edilebilir ve a\u015f\u0131r\u0131 m\u00fchendislikten daha iyidir.<br \/>\n2.  <strong>Kodu Gereksiz Yere Genelle\u015ftirmeyin:<\/strong> Gelecekteki olas\u0131 ihtiya\u00e7lar i\u00e7in kodu a\u015f\u0131r\u0131 derecede genelle\u015ftirmeye \u00e7al\u0131\u015fmak, genellikle karma\u015f\u0131kl\u0131\u011f\u0131 art\u0131r\u0131r ve bak\u0131m\u0131 zorla\u015ft\u0131r\u0131r. Yaln\u0131zca mevcut ihtiya\u00e7lar\u0131 kar\u015f\u0131layacak kadar soyutlama yap\u0131n.<br \/>\n3.  <strong>\u0130simlendirme Standartlar\u0131na Dikkat Edin:<\/strong><br \/>\n    *   <strong>Composables i\u00e7in <code>use<\/code> \u00f6neki:<\/strong> \u00d6rne\u011fin, <code>useMousePosition<\/code>, <code>useAuth<\/code>. Bu, bir fonksiyonun bir composable oldu\u011funu ve reaktif durum veya yan etkiler i\u00e7erebilece\u011fini g\u00f6sterir.<br \/>\n    *   <strong>Mixins i\u00e7in <code>mixin<\/code> son eki:<\/strong> \u00d6rne\u011fin, <code>fetchDataMixin<\/code>.<br \/>\n    *   A\u00e7\u0131k ve a\u00e7\u0131klay\u0131c\u0131 isimler kullan\u0131n.<br \/>\n4.  <strong>TypeScript ile Kullan\u0131rken Tip G\u00fcvenli\u011fine \u00d6zen G\u00f6sterin:<\/strong> Composition API, TypeScript ile m\u00fckemmel entegrasyon sunar. Composables&#8217;lar\u0131n\u0131z i\u00e7in do\u011fru tipleri tan\u0131mlamak, uygulaman\u0131z\u0131n sa\u011flaml\u0131\u011f\u0131n\u0131 art\u0131r\u0131r ve geli\u015ftirme s\u0131ras\u0131nda hatalar\u0131 yakalaman\u0131za yard\u0131mc\u0131 olur.<br \/>\n5.  <strong>K\u00fc\u00e7\u00fck Par\u00e7alara Ay\u0131r\u0131n:<\/strong> Hem bile\u015fenlerinizi hem de composable&#8217;lar\u0131n\u0131z\u0131 k\u00fc\u00e7\u00fck, odaklanm\u0131\u015f ve tek bir sorumlulu\u011fa sahip par\u00e7alara ay\u0131r\u0131n. Bu, yeniden kullan\u0131labilirli\u011fi art\u0131r\u0131r ve kodu daha y\u00f6netilebilir hale getirir.<br \/>\n6.  <strong>Belgeleme:<\/strong> \u00d6zellikle payla\u015f\u0131lan mixin&#8217;ler veya composable&#8217;lar i\u00e7in, ne i\u015fe yarad\u0131klar\u0131n\u0131, hangi parametreleri ald\u0131klar\u0131n\u0131 ve ne d\u00f6nd\u00fcrd\u00fcklerini belgeleyin. Bu, di\u011fer geli\u015ftiricilerin (ve gelecekteki sizin) bunlar\u0131 anlamas\u0131n\u0131 ve kullanmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<br \/>\n7.  <strong>Test Edilebilirlik:<\/strong> Yeniden kullan\u0131labilir mant\u0131k par\u00e7alar\u0131n\u0131 (\u00f6zellikle composable&#8217;lar\u0131) ayr\u0131 ayr\u0131 test etmeye \u00f6zen g\u00f6sterin. Bu, birle\u015ftirildikleri bile\u015fenlerde daha g\u00fcvenilir olduklar\u0131n\u0131 garanti eder.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Vue.js, modern web uygulamalar\u0131 geli\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir framework&#8217;t\u00fcr. Bu g\u00fcc\u00fcn \u00f6nemli bir par\u00e7as\u0131, DRY prensibini uygulamak i\u00e7in sundu\u011fu \u00e7e\u015fitli ara\u00e7lard\u0131r: Slots, Mixins ve Composition API. Her birinin kendine \u00f6zg\u00fc kullan\u0131m durumlar\u0131 ve avantajlar\u0131 vard\u0131r.<\/p>\n<p>*   <strong>Slots<\/strong>, bile\u015fenlerinizin UI yap\u0131s\u0131n\u0131 korurken i\u00e7eri\u011fini dinamik olarak de\u011fi\u015ftirmek i\u00e7in vazge\u00e7ilmezdir. UI katman\u0131nda tekrar\u0131 \u00f6nleyerek bile\u015fenlerinizi daha esnek ve yeniden kullan\u0131labilir hale getirir.<br \/>\n*   <strong>Mixins<\/strong>, \u00f6zellikle Vue 2 projelerinde k\u00fc\u00e7\u00fck ve ba\u011f\u0131ms\u0131z mant\u0131k par\u00e7alar\u0131n\u0131 payla\u015fmak i\u00e7in kullan\u0131\u015fl\u0131 olsa da, modern Vue 3 geli\u015ftirme i\u00e7in baz\u0131 dezavantajlar\u0131 (isim \u00e7ak\u0131\u015fmalar\u0131, \u00f6rt\u00fck ba\u011f\u0131ml\u0131l\u0131klar) nedeniyle genellikle tercih edilmez.<br \/>\n*   <strong>Composition API<\/strong> ve onunla birlikte gelen <strong>Composables<\/strong>, Vue 3&#8217;\u00fcn en g\u00fc\u00e7l\u00fc yeniliklerinden biridir. Karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131n\u0131 ilgili \u00f6zelliklere g\u00f6re d\u00fczenlemek, yeniden kullanmak ve TypeScript ile m\u00fckemmel bir \u015fekilde entegre olmak i\u00e7in en iyi \u00e7\u00f6z\u00fcm\u00fc sunar. Mant\u0131k tekrar\u0131n\u0131 \u00f6nlemede, kodun okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 art\u0131rmada modern ve tercih edilen yakla\u015f\u0131md\u0131r.<\/p>\n<p>Vue.js geli\u015ftiricileri olarak, bu ara\u00e7lar\u0131 do\u011fru bir \u015fekilde anlamak ve hangi senaryoda hangisini kullanaca\u011f\u0131m\u0131za karar vermek, daha temiz, daha s\u00fcrd\u00fcr\u00fclebilir ve daha \u00f6l\u00e7eklenebilir uygulamalar olu\u015fturman\u0131n anahtar\u0131d\u0131r. DRY prensibini benimseyerek ve Vue.js&#8217;in sundu\u011fu bu g\u00fc\u00e7l\u00fc mekanizmalar\u0131 ak\u0131ll\u0131ca kullanarak, hem geli\u015ftirme s\u00fcrecini h\u0131zland\u0131rabilir hem de gelecekteki bak\u0131m y\u00fck\u00fcn\u00fc azaltabilirsiniz. Unutmay\u0131n, iyi yaz\u0131lm\u0131\u015f bir kod, sadece i\u015flevsel olmakla kalmaz, ayn\u0131 zamanda okunabilir, bak\u0131m\u0131 kolay ve geni\u015fletilebilir olmal\u0131d\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Vue.js Uygulaman\u0131z\u0131 Slots, Mixins ve Composition API ile DRY Hale Getirme\nGiri\u015f\nModern web geli\u015ftirme d\u00fcnyas\u0131nda, s\u00fcrd\u00fcr\u00fclebilir, bak\u0131m\u0131","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-39454","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 Uygulaman\u0131z\u0131 Slots, Mixins ve Composition API ile DRY Hale Getirme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vue.js Uygulaman\u0131z\u0131 Slots, Mixins ve Composition API ile DRY Hale Getirme\" \/>\n<meta property=\"og:description\" content=\"Vue.js Uygulaman\u0131z\u0131 Slots, Mixins ve Composition API ile DRY Hale Getirme Giri\u015f Modern web geli\u015ftirme d\u00fcnyas\u0131nda, s\u00fcrd\u00fcr\u00fclebilir, bak\u0131m\u0131\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-21T15: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=\"20 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Vue.js Uygulaman\u0131z\u0131 Slots, Mixins ve Composition API ile DRY Hale Getirme\",\"datePublished\":\"2026-02-21T15:40:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/\"},\"wordCount\":3598,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Vue\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/\",\"name\":\"Vue.js Uygulaman\u0131z\u0131 Slots, Mixins ve Composition API ile DRY Hale Getirme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-21T15:40:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vue.js Uygulaman\u0131z\u0131 Slots, Mixins ve Composition API ile DRY Hale Getirme\"}]},{\"@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 Uygulaman\u0131z\u0131 Slots, Mixins ve Composition API ile DRY Hale Getirme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/","og_locale":"tr_TR","og_type":"article","og_title":"Vue.js Uygulaman\u0131z\u0131 Slots, Mixins ve Composition API ile DRY Hale Getirme","og_description":"Vue.js Uygulaman\u0131z\u0131 Slots, Mixins ve Composition API ile DRY Hale Getirme Giri\u015f Modern web geli\u015ftirme d\u00fcnyas\u0131nda, s\u00fcrd\u00fcr\u00fclebilir, bak\u0131m\u0131","og_url":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-21T15:40:55+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"20 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Vue.js Uygulaman\u0131z\u0131 Slots, Mixins ve Composition API ile DRY Hale Getirme","datePublished":"2026-02-21T15:40:55+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/"},"wordCount":3598,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Vue"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/","url":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/","name":"Vue.js Uygulaman\u0131z\u0131 Slots, Mixins ve Composition API ile DRY Hale Getirme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-21T15:40:55+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamanizi-slots-mixins-ve-composition-api-ile-dry-hale-getirme\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Vue.js Uygulaman\u0131z\u0131 Slots, Mixins ve Composition API ile DRY Hale Getirme"}]},{"@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\/39454","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=39454"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39454\/revisions"}],"predecessor-version":[{"id":39455,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39454\/revisions\/39455"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=39454"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=39454"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=39454"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}