{"id":34573,"date":"2025-11-19T01:40:49","date_gmt":"2025-11-18T22:40:49","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=34573"},"modified":"2025-11-19T01:40:49","modified_gmt":"2025-11-18T22:40:49","slug":"vue-js-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/vue-js-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/","title":{"rendered":"Vue.js Durum Y\u00f6netimi: Vuex ile Uygulaman\u0131z\u0131n Kalbini Y\u00f6netmek"},"content":{"rendered":"<p><body><\/p>\n<h2>Vue.js Durum Y\u00f6netimi: Vuex ile Uygulaman\u0131z\u0131n Kalbini Y\u00f6netmek<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>Modern web uygulamalar\u0131, \u00f6zellikle tek sayfal\u0131k uygulamalar (SPA&#8217;lar), kullan\u0131c\u0131 aray\u00fcz\u00fcnde karma\u015f\u0131k etkile\u015fimler ve yo\u011fun veri ak\u0131\u015flar\u0131 bar\u0131nd\u0131r\u0131r. Bu karma\u015f\u0131kl\u0131k, uygulaman\u0131n farkl\u0131 bile\u015fenleri aras\u0131nda veri payla\u015f\u0131m\u0131n\u0131 ve senkronizasyonunu zorunlu k\u0131lar. Bir uygulaman\u0131n &#8220;durumu&#8221; (state), o anki verilerini ve kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc belirleyen her \u015feyi ifade eder. K\u00fc\u00e7\u00fck uygulamalarda bile\u015fenler aras\u0131 veri ak\u0131\u015f\u0131 prop&#8217;lar (yukar\u0131dan a\u015fa\u011f\u0131ya) ve olaylar (a\u015fa\u011f\u0131dan yukar\u0131ya) ile y\u00f6netilebilirken, uygulama b\u00fcy\u00fcd\u00fck\u00e7e bu y\u00f6ntemler yetersiz kal\u0131r ve &#8220;prop drilling&#8221; gibi sorunlara yol a\u00e7ar. Bu noktada, merkezi bir durum y\u00f6netimi k\u00fct\u00fcphanesine olan ihtiya\u00e7 ortaya \u00e7\u0131kar.<\/p>\n<p>Vue.js ekosistemi i\u00e7in tasarlanm\u0131\u015f resmi durum y\u00f6netimi k\u00fct\u00fcphanesi olan Vuex, bu sorunu zarif ve \u00f6ng\u00f6r\u00fclebilir bir \u015fekilde \u00e7\u00f6zmek i\u00e7in tek bir merkezi depolama alan\u0131 (store) sa\u011flar. Vuex, t\u00fcm uygulaman\u0131z\u0131n durumunu tek bir yerde tutarak, bile\u015fenlerinizin bu duruma eri\u015fmesini ve onu de\u011fi\u015ftirmesini standart bir protokolle m\u00fcmk\u00fcn k\u0131lar. Bu makalede, Vuex&#8217;in temel prensiplerini, mimarisini, bile\u015fenlerini ve Vue.js uygulamalar\u0131n\u0131zda nas\u0131l etkili bir \u015fekilde kullan\u0131labilece\u011fini detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>Durum Y\u00f6netimi Neden \u00d6nemlidir?<\/h3>\n<p>Uygulaman\u0131z\u0131n durumu, oturum a\u00e7m\u0131\u015f kullan\u0131c\u0131 bilgileri, sepet \u00f6\u011feleri, API&#8217;den gelen veriler, UI bile\u015fenlerinin g\u00f6r\u00fcn\u00fcrl\u00fck ayarlar\u0131 gibi bir\u00e7ok farkl\u0131 veriyi i\u00e7erebilir. Bu veriler, uygulaman\u0131n farkl\u0131 yerlerinde birden fazla bile\u015fen taraf\u0131ndan kullan\u0131labilir veya de\u011fi\u015ftirilebilir. Geleneksel y\u00f6ntemlerle bu verileri y\u00f6netmeye \u00e7al\u0131\u015fmak, a\u015fa\u011f\u0131daki sorunlara yol a\u00e7abilir:<\/p>\n<p>*   <strong>Veri Senkronizasyonu Zorluklar\u0131:<\/strong> Bir bile\u015fende yap\u0131lan de\u011fi\u015fikliklerin di\u011fer ilgili bile\u015fenlere yans\u0131t\u0131lmas\u0131 karma\u015f\u0131k hale gelir.<br \/>\n*   <strong>&#8220;Prop Drilling&#8221;:<\/strong> Verinin, asl\u0131nda ihtiyac\u0131 olmayan ara bile\u015fenler \u00fczerinden ge\u00e7irilmesi durumu. Bu, kodun okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 zorla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Hata Ay\u0131klama Zorluklar\u0131:<\/strong> Hatalar\u0131n kayna\u011f\u0131n\u0131 bulmak zorla\u015f\u0131r \u00e7\u00fcnk\u00fc bir durum de\u011fi\u015fikli\u011finin nereden geldi\u011fini takip etmek g\u00fc\u00e7le\u015fir.<br \/>\n*   <strong>\u00d6ng\u00f6r\u00fclemezlik:<\/strong> Uygulaman\u0131n durumunun ne zaman ve nas\u0131l de\u011fi\u015fece\u011fi belirsizle\u015fir.<\/p>\n<p>Vuex, bu sorunlar\u0131 \u00e7\u00f6zerek uygulamalar\u0131n\u0131z\u0131n daha \u00f6l\u00e7eklenebilir, bak\u0131m\u0131 daha kolay ve \u00f6ng\u00f6r\u00fclebilir olmas\u0131n\u0131 sa\u011flar. Merkezi bir depolama alan\u0131 ve kat\u0131 kurallar sayesinde, durum de\u011fi\u015fiklikleri her zaman izlenebilir ve anla\u015f\u0131labilir hale gelir.<\/p>\n<h3>Vuex&#8217;in Temel Kavramlar\u0131<\/h3>\n<p>Vuex, tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131 prensibine dayan\u0131r ve d\u00f6rt ana bile\u015fenden olu\u015fur: State, Getters, Mutations ve Actions. Bu bile\u015fenler birlikte \u00e7al\u0131\u015farak uygulaman\u0131n durumunu y\u00f6netir.<\/p>\n<h4>Tek Y\u00f6nl\u00fc Veri Ak\u0131\u015f\u0131 (Unidirectional Data Flow)<\/h4>\n<p>Vuex, durumu y\u00f6netmek i\u00e7in kat\u0131 bir tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131 modeli benimser:<\/p>\n<p>1.  <strong>State:<\/strong> Uygulaman\u0131n temel verilerini bar\u0131nd\u0131r\u0131r.<br \/>\n2.  <strong>View (G\u00f6r\u00fcn\u00fcm):<\/strong> State&#8217;i g\u00f6r\u00fcnt\u00fcleyen Vue bile\u015fenleridir.<br \/>\n3.  <strong>Actions:<\/strong> Kullan\u0131c\u0131 etkile\u015fimleri veya asenkron i\u015flemler sonucunda tetiklenir. State&#8217;i do\u011frudan de\u011fi\u015ftiremezler.<br \/>\n4.  <strong>Mutations:<\/strong> State&#8217;i de\u011fi\u015ftiren tek yoldur. Actions taraf\u0131ndan \u00e7a\u011fr\u0131l\u0131rlar ve her zaman senkron olmal\u0131d\u0131rlar.<\/p>\n<p>Bu d\u00f6ng\u00fc, durum de\u011fi\u015fikliklerinin izlenebilirli\u011fini ve \u00f6ng\u00f6r\u00fclebilirli\u011fini art\u0131r\u0131r.<\/p>\n<h4>Merkezi Durum Deposu (Centralized State Store)<\/h4>\n<p>Vuex&#8217;in kalbinde, t\u00fcm uygulaman\u0131z\u0131n durumunu bar\u0131nd\u0131ran tek bir merkezi depo (store) bulunur. Bu depo, uygulaman\u0131z\u0131n &#8220;tek do\u011fru kaynak&#8221; (single source of truth) noktas\u0131d\u0131r. T\u00fcm bile\u015fenler, ihtiya\u00e7 duyduklar\u0131 duruma bu depodan eri\u015fir.<\/p>\n<h3>Vuex Mimarisi ve Bile\u015fenleri<\/h3>\n<p>\u015eimdi Vuex&#8217;in temel yap\u0131 ta\u015flar\u0131n\u0131 ve her birinin rol\u00fcn\u00fc daha yak\u0131ndan inceleyelim.<\/p>\n<h4>State<\/h4>\n<p><code>State<\/code>, uygulaman\u0131z\u0131n temel verilerini i\u00e7eren JavaScript nesnesidir. Bir Vuex deposundaki state, Vue&#8217;nun reaktif sistemine entegre edilmi\u015ftir. Bu, state&#8217;teki bir de\u011fi\u015fiklik oldu\u011funda, bu state&#8217;i kullanan t\u00fcm Vue bile\u015fenlerinin otomatik olarak g\u00fcncellenece\u011fi anlam\u0131na gelir.<\/p>\n<p><strong>Tan\u0131m:<\/strong><br \/>\nUygulaman\u0131n t\u00fcm durumunu (verilerini) bar\u0131nd\u0131ran merkezi nesnedir.<\/p>\n<p><strong>\u00d6rnek Tan\u0131mlama:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ store\/index.js\nconst store = new Vuex.Store({\n  state: {\n    sayac: 0,\n    kullanici: null,\n    urunler: []\n  }\n});<\/code><\/pre>\n<p><strong>Eri\u015fim:<\/strong><br \/>\nBir Vue bile\u015feni i\u00e7inde state&#8217;e <code>this.$store.state<\/code> \u00fczerinden eri\u015febilirsiniz.<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <p>Saya\u00e7: {{ $store.state.sayac }}<\/p>\n    <p v-if=\"$store.state.kullanici\">Ho\u015f Geldiniz, {{ $store.state.kullanici.ad }}!<\/p>\n  <\/div>\n<\/template><\/code><\/pre>\n<p>Daha temiz bir eri\u015fim i\u00e7in <code>mapState<\/code> yard\u0131mc\u0131 fonksiyonunu kullanmak daha yayg\u0131nd\u0131r:<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <p>Saya\u00e7: {{ sayac }}<\/p>\n    <p v-if=\"kullanici\">Ho\u015f Geldiniz, {{ kullanici.ad }}!<\/p>\n  <\/div>\n<\/template>\n\n<script>\nimport { mapState } from 'vuex';\n\nexport default {\n  computed: {\n    ...mapState({\n      sayac: state => state.sayac,\n      kullanici: state => state.kullanici\n    }),\n    \/\/ Veya bir dizi olarak daha k\u0131sa:\n    \/\/ ...mapState(['sayac', 'kullanici'])\n  }\n};\n<\/script><\/code><\/pre>\n<p><code>mapState<\/code> ile state \u00f6zelliklerini bile\u015fenin <code>computed<\/code> \u00f6zelliklerine e\u015fleyerek, sanki bile\u015fenin kendi verisiymi\u015f gibi eri\u015fim sa\u011flayabilirsiniz.<\/p>\n<h4>Getters<\/h4>\n<p><code>Getters<\/code>, Vuex store&#8217;undaki state&#8217;ten t\u00fcretilmi\u015f (computed) verilerdir. T\u0131pk\u0131 Vue bile\u015fenlerindeki <code>computed<\/code> \u00f6zellikler gibi, getters da ba\u011f\u0131ml\u0131l\u0131klar\u0131 de\u011fi\u015fti\u011finde otomatik olarak yeniden hesaplan\u0131r. Getters, state&#8217;i do\u011frudan de\u011fi\u015ftirmeden okuma ve filtreleme i\u015flemleri i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p><strong>Tan\u0131m:<\/strong><br \/>\nState verilerini i\u015fleyerek (filtreleme, d\u00f6n\u00fc\u015ft\u00fcrme vb.) yeni de\u011ferler t\u00fcreten fonksiyonlard\u0131r. State&#8217;i do\u011frudan de\u011fi\u015ftirmezler.<\/p>\n<p><strong>\u00d6rnek Tan\u0131mlama:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ store\/index.js\nconst store = new Vuex.Store({\n  state: {\n    urunler: [\n      { id: 1, ad: 'Elma', fiyat: 10, stok: 5 },\n      { id: 2, ad: 'Armut', fiyat: 15, stok: 0 },\n      { id: 3, ad: 'Muz', fiyat: 20, stok: 10 }\n    ]\n  },\n  getters: {\n    stoktakiUrunler: state => {\n      return state.urunler.filter(urun => urun.stok > 0);\n    },\n    toplamUrunSayisi: (state, getters) => {\n      return getters.stoktakiUrunler.length; \/\/ Ba\u015fka bir getter kullanabilir\n    },\n    urunById: (state) => (id) => { \/\/ Parametre alan getter\n      return state.urunler.find(urun => urun.id === id);\n    }\n  }\n});<\/code><\/pre>\n<p><strong>Eri\u015fim:<\/strong><br \/>\nBir Vue bile\u015feni i\u00e7inde getters&#8217;a <code>this.$store.getters<\/code> \u00fczerinden eri\u015febilirsiniz.<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <h3>Stoktaki \u00dcr\u00fcnler ({{ $store.getters.toplamUrunSayisi }})<\/h3>\n    <ul>\n      <li v-for=\"urun in $store.getters.stoktakiUrunler\" :key=\"urun.id\">\n        {{ urun.ad }} - {{ urun.fiyat }} TL (Stok: {{ urun.stok }})\n      <\/li>\n    <\/ul>\n    <p>ID'si 1 olan \u00fcr\u00fcn: {{ $store.getters.urunById(1)?.ad }}<\/p>\n  <\/div>\n<\/template><\/code><\/pre>\n<p>Yine, <code>mapGetters<\/code> yard\u0131mc\u0131 fonksiyonu daha temiz bir kullan\u0131m sunar:<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <h3>Stoktaki \u00dcr\u00fcnler ({{ toplamUrunSayisi }})<\/h3>\n    <ul>\n      <li v-for=\"urun in stoktakiUrunler\" :key=\"urun.id\">\n        {{ urun.ad }} - {{ urun.fiyat }} TL (Stok: {{ urun.stok }})\n      <\/li>\n    <\/ul>\n    <p>ID'si 1 olan \u00fcr\u00fcn: {{ urunById(1)?.ad }}<\/p>\n  <\/div>\n<\/template>\n\n<script>\nimport { mapGetters } from 'vuex';\n\nexport default {\n  computed: {\n    ...mapGetters([\n      'stoktakiUrunler',\n      'toplamUrunSayisi',\n      'urunById' \/\/ Parametre alan getter'\u0131 da e\u015fleyebilirsiniz\n    ])\n  }\n};\n<\/script><\/code><\/pre>\n<h4>Mutations<\/h4>\n<p><code>Mutations<\/code>, Vuex store&#8217;undaki state&#8217;i de\u011fi\u015ftiren tek yoldur. Mutations&#8217;lar her zaman senkron olmal\u0131d\u0131r. Bu kural, Vue DevTools&#8217;un her bir state de\u011fi\u015fikli\u011fini do\u011fru bir \u015fekilde izlemesini ve zaman yolculu\u011fu hata ay\u0131klamas\u0131n\u0131 (time-travel debugging) m\u00fcmk\u00fcn k\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<p><strong>Tan\u0131m:<\/strong><br \/>\nState&#8217;i do\u011frudan ve senkron bir \u015fekilde de\u011fi\u015ftiren fonksiyonlard\u0131r.<\/p>\n<p><strong>\u00d6rnek Tan\u0131mlama:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ store\/index.js\nconst store = new Vuex.Store({\n  state: {\n    sayac: 0\n  },\n  mutations: {\n    ARTTIR(state) {\n      state.sayac++;\n    },\n    AZALT(state) {\n      state.sayac--;\n    },\n    SAYAC_AYARLA(state, payload) { \/\/ Payload ile veri alabilir\n      state.sayac = payload.yeniDeger;\n    },\n    URUN_STOK_GUNCELLE(state, { id, miktar }) {\n      const urun = state.urunler.find(u => u.id === id);\n      if (urun) {\n        urun.stok += miktar;\n      }\n    }\n  }\n});<\/code><\/pre>\n<p><strong>Tetikleme (Commit):<\/strong><br \/>\nMutations&#8217;lar\u0131 do\u011frudan \u00e7a\u011f\u0131rmak yerine, <code>store.commit()<\/code> y\u00f6ntemini kullanarak tetiklersiniz.<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <p>Saya\u00e7: {{ $store.state.sayac }}<\/p>\n    <button @click=\"arttir\">Artt\u0131r<\/button>\n    <button @click=\"azalt\">Azalt<\/button>\n    <button @click=\"ayarla(10)\">10 Yap<\/button>\n  <\/div>\n<\/template>\n\n<script>\nimport { mapMutations } from 'vuex';\n\nexport default {\n  methods: {\n    arttir() {\n      this.$store.commit('ARTTIR');\n    },\n    azalt() {\n      this.$store.commit('AZALT');\n    },\n    ayarla(deger) {\n      this.$store.commit('SAYAC_AYARLA', { yeniDeger: deger });\n    },\n    \/\/ Veya mapMutations ile:\n    ...mapMutations([\n      'ARTTIR', \/\/ this.ARTTIR() olarak eri\u015filebilir\n      'AZALT',\n      'SAYAC_AYARLA'\n    ])\n  }\n};\n<\/script><\/code><\/pre>\n<p><code>mapMutations<\/code> kullanarak mutations&#8217;lar\u0131 bile\u015fenin <code>methods<\/code> \u00f6zelliklerine e\u015fleyebilirsiniz.<\/p>\n<p><strong>Neden Senkron Olmal\u0131?<\/strong><br \/>\nMutations&#8217;lar\u0131n senkron olmas\u0131, her bir state de\u011fi\u015fikli\u011finin kesin bir s\u0131raya sahip olmas\u0131n\u0131 sa\u011flar. E\u011fer mutations&#8217;lar asenkron olsayd\u0131, hangi de\u011fi\u015fikli\u011fin ne zaman ger\u00e7ekle\u015fti\u011fini takip etmek ve uygulaman\u0131n durumunu tahmin etmek imkans\u0131z hale gelirdi. Bu, \u00f6zellikle hata ay\u0131klama s\u0131ras\u0131nda b\u00fcy\u00fck sorunlara yol a\u00e7ard\u0131. Asenkron i\u015flemler i\u00e7in Actions kullan\u0131l\u0131r.<\/p>\n<h4>Actions<\/h4>\n<p><code>Actions<\/code>, asenkron i\u015flemleri (API \u00e7a\u011fr\u0131lar\u0131, zamanlay\u0131c\u0131lar vb.) ger\u00e7ekle\u015ftirmek ve ard\u0131ndan mutations&#8217;lar\u0131 \u00e7a\u011f\u0131rarak state&#8217;i de\u011fi\u015ftirmek i\u00e7in kullan\u0131l\u0131r. Actions, state&#8217;i do\u011frudan de\u011fi\u015ftiremez; bunun yerine, bir veya daha fazla mutation&#8217;\u0131 <code>commit<\/code> eder.<\/p>\n<p><strong>Tan\u0131m:<\/strong><br \/>\nAsenkron i\u015flemler yapabilen ve ard\u0131ndan state&#8217;i de\u011fi\u015ftirmek i\u00e7in mutations&#8217;lar\u0131 tetikleyen fonksiyonlard\u0131r.<\/p>\n<p><strong>\u00d6rnek Tan\u0131mlama:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ store\/index.js\nconst store = new Vuex.Store({\n  state: {\n    sayac: 0,\n    yukleniyor: false,\n    hata: null\n  },\n  mutations: {\n    ARTTIR(state) {\n      state.sayac++;\n    },\n    SET_YUKLENIYOR(state, durum) {\n      state.yukleniyor = durum;\n    },\n    SET_HATA(state, mesaj) {\n      state.hata = mesaj;\n    }\n  },\n  actions: {\n    async asenkronArttir({ commit }) { \/\/ context objesinden commit'i alabiliriz\n      commit('SET_YUKLENIYOR', true);\n      commit('SET_HATA', null);\n      try {\n        \/\/ Bir API \u00e7a\u011fr\u0131s\u0131 sim\u00fcle edelim\n        await new Promise(resolve => setTimeout(resolve, 1000));\n        commit('ARTTIR');\n      } catch (error) {\n        commit('SET_HATA', 'Asenkron artt\u0131rma s\u0131ras\u0131nda bir hata olu\u015ftu.');\n      } finally {\n        commit('SET_YUKLENIYOR', false);\n      }\n    },\n    \/\/ Ba\u015fka bir action'\u0131 \u00e7a\u011f\u0131rabilir\n    async fetchKullaniciBilgisi({ commit, dispatch }) {\n      commit('SET_YUKLENIYOR', true);\n      try {\n        const response = await fetch('\/api\/kullanici');\n        const data = await response.json();\n        commit('SET_KULLANICI', data); \/\/ Varsay\u0131msal bir SET_KULLANICI mutation'\u0131\n        dispatch('logIslem', 'Kullan\u0131c\u0131 bilgisi \u00e7ekildi.'); \/\/ Ba\u015fka bir action'\u0131 \u00e7a\u011f\u0131rabilir\n      } catch (error) {\n        commit('SET_HATA', 'Kullan\u0131c\u0131 bilgisi al\u0131namad\u0131.');\n      } finally {\n        commit('SET_YUKLENIYOR', false);\n      }\n    }\n  }\n});<\/code><\/pre>\n<p>Actions&#8217;lar, <code>context<\/code> objesini ilk arg\u00fcman olarak al\u0131r. Bu obje, <code>state<\/code>, <code>getters<\/code>, <code>commit<\/code> ve <code>dispatch<\/code> gibi store \u00f6zelliklerine eri\u015fim sa\u011flar. Genellikle <code>commit<\/code> ve <code>dispatch<\/code> destructuring ile al\u0131n\u0131r.<\/p>\n<p><strong>Tetikleme (Dispatch):<\/strong><br \/>\nActions&#8217;lar\u0131 <code>store.dispatch()<\/code> y\u00f6ntemini kullanarak tetiklersiniz.<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <p>Saya\u00e7: {{ $store.state.sayac }}<\/p>\n    <button @click=\"asenkronArttir\" :disabled=\"$store.state.yukleniyor\">\n      {{ $store.state.yukleniyor ? 'Y\u00fckleniyor...' : 'Asenkron Artt\u0131r' }}\n    <\/button>\n    <p v-if=\"$store.state.hata\" style=\"color: red;\">{{ $store.state.hata }}<\/p>\n  <\/div>\n<\/template>\n\n<script>\nimport { mapActions } from 'vuex';\n\nexport default {\n  methods: {\n    \/\/ Do\u011frudan dispatch:\n    \/\/ asenkronArttir() {\n    \/\/   this.$store.dispatch('asenkronArttir');\n    \/\/ },\n    \/\/ Veya mapActions ile:\n    ...mapActions([\n      'asenkronArttir'\n    ])\n  }\n};\n<\/script><\/code><\/pre>\n<p><code>mapActions<\/code> kullanarak actions&#8217;lar\u0131 bile\u015fenin <code>methods<\/code> \u00f6zelliklerine e\u015fleyebilirsiniz.<\/p>\n<h4>Modules<\/h4>\n<p>B\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalarda, t\u00fcm uygulama durumunu tek bir Vuex store nesnesinde y\u00f6netmek, store&#8217;un \u00e7ok b\u00fcy\u00fck ve karma\u015f\u0131k hale gelmesine neden olabilir. Bu durumda, Vuex store&#8217;unu mant\u0131ksal olarak mod\u00fcllere ay\u0131rabiliriz. Her mod\u00fcl kendi state&#8217;ine, getters&#8217;\u0131na, mutations&#8217;\u0131na ve actions&#8217;\u0131na sahip olabilir.<\/p>\n<p><strong>Tan\u0131m:<\/strong><br \/>\nB\u00fcy\u00fck Vuex store&#8217;lar\u0131n\u0131 mant\u0131ksal olarak b\u00f6l\u00fcmlere ay\u0131rmak i\u00e7in kullan\u0131l\u0131r. Her mod\u00fcl kendi ba\u015f\u0131na bir mini store gibi davran\u0131r.<\/p>\n<p><strong>\u00d6rnek Tan\u0131mlama:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ store\/modules\/sepet.js\nconst sepetModule = {\n  namespaced: true, \/\/ Mod\u00fcl\u00fcn kendi isim alan\u0131na sahip olmas\u0131n\u0131 sa\u011flar\n  state: {\n    urunler: [],\n    toplamTutar: 0\n  },\n  getters: {\n    sepetUrunSayisi: state => state.urunler.length,\n    urunToplamFiyat: (state) => (urunId) => {\n      const urun = state.urunler.find(item => item.id === urunId);\n      return urun ? urun.fiyat * urun.miktar : 0;\n    }\n  },\n  mutations: {\n    SEPETE_EKLE(state, urun) {\n      const mevcutUrun = state.urunler.find(item => item.id === urun.id);\n      if (mevcutUrun) {\n        mevcutUrun.miktar++;\n      } else {\n        state.urunler.push({ ...urun, miktar: 1 });\n      }\n      state.toplamTutar += urun.fiyat;\n    },\n    SEPETTEN_CIKAR(state, urunId) {\n      const index = state.urunler.findIndex(item => item.id === urunId);\n      if (index !== -1) {\n        const urun = state.urunler[index];\n        state.toplamTutar -= urun.fiyat * urun.miktar;\n        state.urunler.splice(index, 1);\n      }\n    }\n  },\n  actions: {\n    async urunEkle({ commit }, urun) {\n      \/\/ Belki bir stok kontrol\u00fc veya API \u00e7a\u011fr\u0131s\u0131\n      await new Promise(resolve => setTimeout(resolve, 300));\n      commit('SEPETE_EKLE', urun);\n    }\n  }\n};\n\nexport default sepetModule;<\/code><\/pre>\n<pre><code class=\"language-javascript\">\/\/ store\/modules\/kullanici.js\nconst kullaniciModule = {\n  namespaced: true,\n  state: {\n    bilgiler: null,\n    girisYapildi: false\n  },\n  mutations: {\n    SET_KULLANICI(state, kullanici) {\n      state.bilgiler = kullanici;\n      state.girisYapildi = true;\n    },\n    LOGOUT(state) {\n      state.bilgiler = null;\n      state.girisYapildi = false;\n    }\n  },\n  actions: {\n    async login({ commit }, credentials) {\n      \/\/ API \u00e7a\u011fr\u0131s\u0131 sim\u00fclasyonu\n      const response = await fetch('\/api\/login', { method: 'POST', body: JSON.stringify(credentials) });\n      const data = await response.json();\n      commit('SET_KULLANICI', data.kullanici);\n      return data.success;\n    },\n    async logout({ commit }) {\n      await fetch('\/api\/logout');\n      commit('LOGOUT');\n    }\n  }\n};\n\nexport default kullaniciModule;<\/code><\/pre>\n<pre><code class=\"language-javascript\">\/\/ store\/index.js (Ana store)\nimport Vue from 'vue';\nimport Vuex from 'vuex';\nimport sepetModule from '.\/modules\/sepet';\nimport kullaniciModule from '.\/modules\/kullanici';\n\nVue.use(Vuex);\n\nconst store = new Vuex.Store({\n  state: {\n    \/\/ Global state\n  },\n  getters: {\n    \/\/ Global getters\n  },\n  mutations: {\n    \/\/ Global mutations\n  },\n  actions: {\n    \/\/ Global actions\n  },\n  modules: {\n    sepet: sepetModule,\n    kullanici: kullaniciModule\n  }\n});\n\nexport default store;<\/code><\/pre>\n<p><strong>Eri\u015fim (Namespaced Modules):<\/strong><br \/>\nMod\u00fcller <code>namespaced: true<\/code> olarak i\u015faretlendi\u011finde, state, getters, mutations ve actions&#8217;a eri\u015firken mod\u00fcl ad\u0131n\u0131 kullanman\u0131z gerekir.<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <h3>Sepet<\/h3>\n    <p>Sepetteki \u00dcr\u00fcn Say\u0131s\u0131: {{ sepetUrunSayisi }}<\/p>\n    <button @click=\"urunEkle(ornekUrun)\">\u00d6rnek \u00dcr\u00fcn Ekle<\/button>\n\n    <h3>Kullan\u0131c\u0131<\/h3>\n    <p v-if=\"girisYapildi\">Ho\u015f Geldiniz, {{ kullaniciBilgileri.ad }}!<\/p>\n    <button v-else @click=\"login({ username: 'test', password: '123' })\">Giri\u015f Yap<\/button>\n    <button v-if=\"girisYapildi\" @click=\"logout\">\u00c7\u0131k\u0131\u015f Yap<\/button>\n  <\/div>\n<\/template>\n\n<script>\nimport { mapState, mapGetters, mapMutations, mapActions } from 'vuex';\n\nexport default {\n  data() {\n    return {\n      ornekUrun: { id: 101, ad: 'Klavye', fiyat: 250 }\n    };\n  },\n  computed: {\n    \/\/ 'sepet' mod\u00fcl\u00fcnden state ve getters\n    ...mapState('sepet', {\n      sepetUrunler: state => state.urunler\n    }),\n    ...mapGetters('sepet', [\n      'sepetUrunSayisi'\n    ]),\n\n    \/\/ 'kullanici' mod\u00fcl\u00fcnden state ve getters\n    ...mapState('kullanici', {\n      kullaniciBilgileri: state => state.bilgiler,\n      girisYapildi: state => state.girisYapildi\n    })\n  },\n  methods: {\n    \/\/ 'sepet' mod\u00fcl\u00fcnden mutations ve actions\n    ...mapMutations('sepet', [\n      'SEPETE_EKLE'\n    ]),\n    ...mapActions('sepet', [\n      'urunEkle'\n    ]),\n\n    \/\/ 'kullanici' mod\u00fcl\u00fcnden actions\n    ...mapActions('kullanici', [\n      'login',\n      'logout'\n    ])\n  }\n};\n<\/script><\/code><\/pre>\n<p>Mod\u00fcller, b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda kodun daha d\u00fczenli, okunabilir ve bak\u0131m\u0131 kolay olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Vuex Kurulumu ve Temel Kullan\u0131m<\/h3>\n<p>Bir Vue.js projesinde Vuex&#8217;i kullanmaya ba\u015flamak olduk\u00e7a basittir.<\/p>\n<p>1.  <strong>Kurulum:<\/strong><\/p>\n<pre><code class=\"language-bash\">npm install vuex\n    # veya\n    yarn add vuex<\/code><\/pre>\n<p>2.  <strong>Store Olu\u015fturma:<\/strong><br \/>\n    Genellikle <code>src\/store\/index.js<\/code> ad\u0131nda bir dosya olu\u015fturulur.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/store\/index.js\n    import Vue from 'vue';\n    import Vuex from 'vuex';\n\n    Vue.use(Vuex); \/\/ Vue'ya Vuex kullanaca\u011f\u0131n\u0131 s\u00f6yle\n\n    export default new Vuex.Store({\n      state: {\n        sayac: 0\n      },\n      mutations: {\n        increment(state) {\n          state.sayac++;\n        },\n        decrement(state) {\n          state.sayac--;\n        }\n      },\n      actions: {\n        asyncIncrement({ commit }) {\n          setTimeout(() => {\n            commit('increment');\n          }, 1000);\n        }\n      },\n      getters: {\n        ciftMi: state => state.sayac % 2 === 0\n      }\n    });<\/code><\/pre>\n<p>3.  <strong>Uygulamaya Entegre Etme:<\/strong><br \/>\n    <code>src\/main.js<\/code> dosyas\u0131nda olu\u015fturulan store&#8217;u Vue uygulamas\u0131na ekleyin.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/main.js\n    import Vue from 'vue';\n    import App from '.\/App.vue';\n    import store from '.\/store'; \/\/ Store dosyas\u0131n\u0131 i\u00e7e aktar\n\n    Vue.config.productionTip = false;\n\n    new Vue({\n      store, \/\/ Store'u Vue \u00f6rne\u011fine ekle\n      render: h => h(App)\n    }).$mount('#app');<\/code><\/pre>\n<p>Art\u0131k t\u00fcm Vue bile\u015fenleriniz <code>this.$store<\/code> \u00fczerinden Vuex store&#8217;una eri\u015febilir.<\/p>\n<h3>Geli\u015fmi\u015f Konular ve En \u0130yi Uygulamalar<\/h3>\n<p>Vuex, sadece temel durum y\u00f6netiminden fazlas\u0131n\u0131 sunar. \u0130\u015fte baz\u0131 geli\u015fmi\u015f konular ve en iyi uygulamalar:<\/p>\n<h4>Plugins<\/h4>\n<p>Vuex, store&#8217;a \u00f6zel davran\u0131\u015flar eklemek i\u00e7in eklentileri (plugins) destekler. Eklentiler, her mutation&#8217;\u0131 dinleyebilir ve \u00f6rne\u011fin localStorage&#8217;a veri kaydetmek veya hata raporlama yapmak gibi yan etkiler ger\u00e7ekle\u015ftirebilir.<\/p>\n<p><strong>\u00d6rnek: vuex-persistedstate<\/strong><br \/>\nBu pop\u00fcler eklenti, Vuex state&#8217;ini otomatik olarak taray\u0131c\u0131n\u0131n localStorage&#8217;\u0131nda saklaman\u0131z\u0131 ve uygulama y\u00fcklendi\u011finde geri y\u00fcklemenizi sa\u011flar.<\/p>\n<pre><code class=\"language-bash\">npm install vuex-persistedstate<\/code><\/pre>\n<pre><code class=\"language-javascript\">\/\/ src\/store\/index.js\nimport createPersistedState from 'vuex-persistedstate';\n\nexport default new Vuex.Store({\n  \/\/ ... state, mutations, actions, getters\n  plugins: [createPersistedState()]\n});<\/code><\/pre>\n<h4>Strict Mode<\/h4>\n<p>Geli\u015ftirme ortam\u0131nda, Vuex&#8217;i &#8220;strict mode&#8221;da \u00e7al\u0131\u015ft\u0131rmak \u015fiddetle tavsiye edilir. Strict mode a\u00e7\u0131kken, bir mutation d\u0131\u015f\u0131ndaki herhangi bir yolla state&#8217;i de\u011fi\u015ftirmeye \u00e7al\u0131\u015f\u0131rsan\u0131z bir hata f\u0131rlat\u0131l\u0131r. Bu, durum de\u011fi\u015fikliklerinin her zaman \u00f6ng\u00f6r\u00fclebilir bir \u015fekilde ger\u00e7ekle\u015fti\u011finden emin olman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/store\/index.js\nexport default new Vuex.Store({\n  strict: process.env.NODE_ENV !== 'production', \/\/ Sadece geli\u015ftirme ortam\u0131nda etkinle\u015ftir\n  \/\/ ...\n});<\/code><\/pre>\n<h4>Test Edilebilirlik<\/h4>\n<p>Vuex store&#8217;unuzu test etmek, uygulaman\u0131z\u0131n g\u00fcvenilirli\u011fini art\u0131r\u0131r. Store&#8217;un kendisi, mod\u00fcller, getters, mutations ve actions ayr\u0131 ayr\u0131 test edilebilir. Unit testler yazarken, mutations&#8217;lar saf fonksiyonlar oldu\u011fu i\u00e7in kolayca test edilebilir. Actions&#8217;lar ise genellikle mocked API \u00e7a\u011fr\u0131lar\u0131 ile test edilir.<\/p>\n<h4>B\u00fcy\u00fck Uygulamalarda Klas\u00f6r Yap\u0131s\u0131<\/h4>\n<p>Mod\u00fcller kullan\u0131rken, store yap\u0131n\u0131z\u0131 d\u00fczenli tutmak \u00f6nemlidir. Yayg\u0131n bir yap\u0131 \u015f\u00f6yledir:<\/p>\n<pre><code class=\"language-\">src\/\n\u251c\u2500\u2500 store\/\n\u2502   \u251c\u2500\u2500 index.js          # Ana Vuex store'u tan\u0131mlar\n\u2502   \u2514\u2500\u2500 modules\/\n\u2502       \u251c\u2500\u2500 auth.js       # Kimlik do\u011frulama ile ilgili mod\u00fcl\n\u2502       \u251c\u2500\u2500 products.js   # \u00dcr\u00fcnlerle ilgili mod\u00fcl\n\u2502       \u2514\u2500\u2500 cart.js       # Sepet ile ilgili mod\u00fcl<\/code><\/pre>\n<p>Bu yap\u0131, her mod\u00fcl\u00fcn kendi sorumluluk alan\u0131na sahip olmas\u0131n\u0131 ve uygulaman\u0131n b\u00fcy\u00fcmesine paralel olarak kolayca geni\u015fletilebilmesini sa\u011flar.<\/p>\n<h4>Alternatifler ve Ne Zaman Vuex Kullanmal\u0131?<\/h4>\n<p>Vuex, g\u00fc\u00e7l\u00fc bir durum y\u00f6netimi \u00e7\u00f6z\u00fcm\u00fcd\u00fcr, ancak her zaman gerekli de\u011fildir.<\/p>\n<p>*   <strong>K\u00fc\u00e7\u00fck Uygulamalar:<\/strong> E\u011fer uygulaman\u0131z k\u00fc\u00e7\u00fckse ve bile\u015fenler aras\u0131 veri payla\u015f\u0131m\u0131 minimum d\u00fczeydeyse, basit <code>props<\/code>\/<code>events<\/code> veya <code>provide<\/code>\/<code>inject<\/code> API&#8217;si yeterli olabilir. <code>provide<\/code>\/<code>inject<\/code>, prop drilling&#8217;i azaltman\u0131n basit bir yoludur.<br \/>\n*   <strong>Basit Durumlar:<\/strong> Bazen, sadece birka\u00e7 bile\u015fen aras\u0131nda payla\u015f\u0131lan bir durum i\u00e7in basit bir event bus (k\u00fc\u00e7\u00fck bir Vue \u00f6rne\u011fi) da kullan\u0131labilir.<\/p>\n<p>Vuex&#8217;i kullanmaya karar vermeden \u00f6nce, uygulaman\u0131z\u0131n karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 ve gelecekteki \u00f6l\u00e7eklenebilirli\u011fini g\u00f6z \u00f6n\u00fcnde bulundurun. E\u011fer birden fazla bile\u015fen aras\u0131nda payla\u015f\u0131lan ve s\u0131k\u00e7a g\u00fcncellenen bir\u00e7ok durumunuz varsa, Vuex kesinlikle do\u011fru se\u00e7imdir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular ve Hatalar<\/h3>\n<p>*   <strong>State&#8217;i do\u011frudan de\u011fi\u015ftirmek neden k\u00f6t\u00fc?<\/strong><br \/>\n    State&#8217;i do\u011frudan de\u011fi\u015ftirmek (mutations kullanmadan), Vuex&#8217;in tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131 prensibini bozar ve DevTools&#8217;un durum de\u011fi\u015fikliklerini izlemesini engeller. Bu da hata ay\u0131klamay\u0131 son derece zorla\u015ft\u0131r\u0131r ve uygulaman\u0131n \u00f6ng\u00f6r\u00fclemez davran\u0131\u015flar sergilemesine neden olabilir.<\/p>\n<p>*   <strong>Mutations ve Actions aras\u0131ndaki temel fark nedir?<\/strong><br \/>\n    Mutations&#8217;lar <strong>senkron<\/strong>dur ve state&#8217;i do\u011frudan de\u011fi\u015ftiren tek yoldur. Actions&#8217;lar ise <strong>asenkron<\/strong> i\u015flemler yapar (API \u00e7a\u011fr\u0131lar\u0131 gibi) ve state&#8217;i de\u011fi\u015ftirmek i\u00e7in mutations&#8217;lar\u0131 tetikler.<\/p>\n<p>*   <strong>Asenkron i\u015flemler nerede yap\u0131lmal\u0131?<\/strong><br \/>\n    T\u00fcm asenkron mant\u0131k (API \u00e7a\u011fr\u0131lar\u0131, zamanlay\u0131c\u0131lar vb.) Actions i\u00e7inde yer almal\u0131d\u0131r. Actions, bu i\u015flemleri tamamlad\u0131ktan sonra state&#8217;i de\u011fi\u015ftirmek i\u00e7in ilgili Mutations&#8217;lar\u0131 \u00e7a\u011f\u0131r\u0131r.<\/p>\n<p>*   <strong>Mod\u00fcl isim \u00e7ak\u0131\u015fmalar\u0131 nas\u0131l \u00f6nlenir?<\/strong><br \/>\n    Mod\u00fcllerinizi <code>namespaced: true<\/code> ile tan\u0131mlayarak isim \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nlersiniz. Bu, her mod\u00fcl\u00fcn kendi i\u00e7indeki getters, mutations ve actions&#8217;\u0131n kendi isim alan\u0131na sahip olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Vuex, Vue.js uygulamalar\u0131nda durum y\u00f6netimini merkezi, \u00f6ng\u00f6r\u00fclebilir ve \u00f6l\u00e7eklenebilir bir \u015fekilde ele almak i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r. Tek y\u00f6nl\u00fc veri ak\u0131\u015f\u0131, merkezi store yap\u0131s\u0131 ve kat\u0131 kurallar\u0131yla, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k SPA&#8217;lar\u0131n geli\u015ftirilmesini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131r\u0131r. State, Getters, Mutations, Actions ve Modules gibi temel yap\u0131 ta\u015flar\u0131n\u0131 do\u011fru bir \u015fekilde anlayarak ve uygulayarak, uygulaman\u0131z\u0131n kalbini olu\u015fturan verileri etkili bir \u015fekilde y\u00f6netebilirsiniz.<\/p>\n<p>Vuex sayesinde, uygulaman\u0131z\u0131n durumu her zaman tek bir kaynaktan beslenir, de\u011fi\u015fiklikler izlenebilir hale gelir ve bile\u015fenler aras\u0131 veri ak\u0131\u015f\u0131 \u00e7ok daha d\u00fczenli bir hale gelir. Bu da geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r, hatalar\u0131 azalt\u0131r ve uygulaman\u0131z\u0131n uzun vadede s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131r\u0131r. Vue.js ile ciddi bir uygulama geli\u015ftiriyorsan\u0131z, Vuex&#8217;i \u00f6\u011frenmek ve kullanmak, geli\u015ftirme deneyiminizi ve uygulaman\u0131z\u0131n kalitesini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Vue.js Durum Y\u00f6netimi: Vuex ile Uygulaman\u0131z\u0131n Kalbini Y\u00f6netmek\nGiri\u015f\nModern web uygulamalar\u0131, \u00f6zellikle tek sayfal\u0131k uygulamalar (SPA&#8217;lar),","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-34573","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 Durum Y\u00f6netimi: Vuex ile Uygulaman\u0131z\u0131n Kalbini Y\u00f6netmek - 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-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vue.js Durum Y\u00f6netimi: Vuex ile Uygulaman\u0131z\u0131n Kalbini Y\u00f6netmek\" \/>\n<meta property=\"og:description\" content=\"Vue.js Durum Y\u00f6netimi: Vuex ile Uygulaman\u0131z\u0131n Kalbini Y\u00f6netmek Giri\u015f Modern web uygulamalar\u0131, \u00f6zellikle tek sayfal\u0131k uygulamalar (SPA&#039;lar),\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/vue-js-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-18T22:40:49+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=\"15 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-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Vue.js Durum Y\u00f6netimi: Vuex ile Uygulaman\u0131z\u0131n Kalbini Y\u00f6netmek\",\"datePublished\":\"2025-11-18T22:40:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/\"},\"wordCount\":2059,\"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-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/\",\"name\":\"Vue.js Durum Y\u00f6netimi: Vuex ile Uygulaman\u0131z\u0131n Kalbini Y\u00f6netmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-18T22:40:49+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-js-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vue.js Durum Y\u00f6netimi: Vuex ile Uygulaman\u0131z\u0131n Kalbini Y\u00f6netmek\"}]},{\"@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 Durum Y\u00f6netimi: Vuex ile Uygulaman\u0131z\u0131n Kalbini Y\u00f6netmek - 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-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/","og_locale":"tr_TR","og_type":"article","og_title":"Vue.js Durum Y\u00f6netimi: Vuex ile Uygulaman\u0131z\u0131n Kalbini Y\u00f6netmek","og_description":"Vue.js Durum Y\u00f6netimi: Vuex ile Uygulaman\u0131z\u0131n Kalbini Y\u00f6netmek Giri\u015f Modern web uygulamalar\u0131, \u00f6zellikle tek sayfal\u0131k uygulamalar (SPA'lar),","og_url":"https:\/\/fatihsoysal.com\/blog\/vue-js-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-18T22:40:49+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"15 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Vue.js Durum Y\u00f6netimi: Vuex ile Uygulaman\u0131z\u0131n Kalbini Y\u00f6netmek","datePublished":"2025-11-18T22:40:49+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/"},"wordCount":2059,"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-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/","url":"https:\/\/fatihsoysal.com\/blog\/vue-js-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/","name":"Vue.js Durum Y\u00f6netimi: Vuex ile Uygulaman\u0131z\u0131n Kalbini Y\u00f6netmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-18T22:40:49+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/vue-js-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-durum-yonetimi-vuex-ile-uygulamanizin-kalbini-yonetmek\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Vue.js Durum Y\u00f6netimi: Vuex ile Uygulaman\u0131z\u0131n Kalbini Y\u00f6netmek"}]},{"@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\/34573","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=34573"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34573\/revisions"}],"predecessor-version":[{"id":34574,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34573\/revisions\/34574"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34573"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34573"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34573"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}