{"id":32050,"date":"2025-10-17T04:41:04","date_gmt":"2025-10-17T01:41:04","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=32050"},"modified":"2025-10-17T04:41:04","modified_gmt":"2025-10-17T01:41:04","slug":"vue-js-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/","title":{"rendered":"Vue.js Uygulamalar\u0131nda Durum Y\u00f6netimi: Vuex ile Kapsaml\u0131 Bir Yakla\u015f\u0131m"},"content":{"rendered":"<p><body><\/p>\n<h2>Vue.js Uygulamalar\u0131nda Durum Y\u00f6netimi: Vuex ile Kapsaml\u0131 Bir Yakla\u015f\u0131m<\/h2>\n<p>Modern web uygulamalar\u0131, kullan\u0131c\u0131 aray\u00fczlerinin karma\u015f\u0131kl\u0131\u011f\u0131 ve interaktifli\u011fi artt\u0131k\u00e7a, veri y\u00f6netimi konusunda \u00f6nemli zorluklarla kar\u015f\u0131la\u015fmaktad\u0131r. \u00d6zellikle Vue.js gibi bile\u015fen tabanl\u0131 bir framework ile geli\u015ftirilen uygulamalarda, farkl\u0131 bile\u015fenler aras\u0131nda veri payla\u015f\u0131m\u0131 ve senkronizasyonu kritik bir hale gelir. Bu noktada, merkezi bir durum y\u00f6netim sistemi olan Vuex devreye girer. Bu makalede, Vue.js uygulamalar\u0131nda durum y\u00f6netimi ihtiyac\u0131n\u0131, Vuex&#8217;in temel prensiplerini, bile\u015fenlerini ve kullan\u0131m\u0131n\u0131 ayr\u0131nt\u0131l\u0131 bir \u015fekilde inceleyece\u011fiz. Ayr\u0131ca, Vuex ile b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar geli\u015ftirirken dikkat edilmesi gereken en iyi uygulamalara ve mimari yakla\u015f\u0131mlara da de\u011finece\u011fiz.<\/p>\n<h2>Giri\u015f: Neden Durum Y\u00f6netimine \u0130htiya\u00e7 Duyar\u0131z?<\/h2>\n<p>Tek sayfal\u0131k uygulamalar\u0131n (SPA) pop\u00fclaritesi artt\u0131k\u00e7a, kullan\u0131c\u0131 deneyimini zenginle\u015ftiren dinamik ve etkile\u015fimli aray\u00fczler standart haline gelmi\u015ftir. Vue.js gibi bir framework, bu t\u00fcr aray\u00fczleri bile\u015fenlere ay\u0131rarak geli\u015ftirmeyi kolayla\u015ft\u0131r\u0131r. Ancak, bir uygulama b\u00fcy\u00fcd\u00fck\u00e7e ve y\u00fczlerce bile\u015feni i\u00e7ermeye ba\u015flad\u0131k\u00e7a, bile\u015fenler aras\u0131 veri ak\u0131\u015f\u0131n\u0131 y\u00f6netmek karma\u015f\u0131k bir hal alabilir.<\/p>\n<p>Ba\u015flang\u0131\u00e7ta, Vue&#8217;nun props ve event mekanizmalar\u0131, ebeveyn-\u00e7ocuk ili\u015fkisindeki bile\u015fenler aras\u0131nda veri ileti\u015fimini sa\u011flamak i\u00e7in yeterlidir. Ebeveyn bile\u015fenler, props arac\u0131l\u0131\u011f\u0131yla verileri \u00e7ocuklar\u0131na iletirken, \u00e7ocuklar da event&#8217;ler arac\u0131l\u0131\u011f\u0131yla ebeveynlerine mesaj g\u00f6nderebilirler. Ancak, bu model, &#8220;props drilling&#8221; (veriyi bir\u00e7ok ara bile\u015fen \u00fczerinden ge\u00e7irme) veya &#8220;event hell&#8221; (\u00e7ok say\u0131da event&#8217;in y\u00f6netilemez hale gelmesi) gibi sorunlara yol a\u00e7abilir. \u00d6zellikle, ayn\u0131 veriye ihtiya\u00e7 duyan ancak do\u011frudan ebeveyn-\u00e7ocuk ili\u015fkisi i\u00e7inde olmayan karde\u015f bile\u015fenler veya tamamen farkl\u0131 dallardaki bile\u015fenler s\u00f6z konusu oldu\u011funda, bu ileti\u015fim mekanizmalar\u0131 yetersiz kal\u0131r.<\/p>\n<p>\u00d6rne\u011fin, bir e-ticaret uygulamas\u0131nda sepetin durumunu d\u00fc\u015f\u00fcnelim. Sepete \u00fcr\u00fcn ekleyen bir \u00fcr\u00fcn kart\u0131 bile\u015feni, sepetin i\u00e7eri\u011fini g\u00f6steren bir mini sepet bile\u015feni ve \u00f6deme sayfas\u0131ndaki toplam tutar\u0131 g\u00f6steren bir ba\u015fka bile\u015fen, hepsi ayn\u0131 sepet verisine eri\u015fmek ve onu g\u00fcncellemek zorundad\u0131r. Bu bile\u015fenler aras\u0131nda props ve event&#8217;lerle manuel olarak veri senkronizasyonu sa\u011flamak, hem kod tekrar\u0131na yol a\u00e7ar hem de uygulaman\u0131n bak\u0131m\u0131n\u0131 zorla\u015ft\u0131r\u0131r. Ayr\u0131ca, uygulaman\u0131n genel oturum durumu (kullan\u0131c\u0131 giri\u015f yapm\u0131\u015f m\u0131?), tema ayarlar\u0131 veya bildirimler gibi global verilere de merkezi bir yerden eri\u015fim ihtiyac\u0131 do\u011far.<\/p>\n<p>\u0130\u015fte bu noktada, merkezi bir durum y\u00f6netim sistemi devreye girer. Merkezi durum y\u00f6netimi, uygulaman\u0131n t\u00fcm durumunu tek bir yerde toplar ve bu duruma eri\u015fim ile de\u011fi\u015fiklikleri \u00f6ng\u00f6r\u00fclebilir ve izlenebilir bir \u015fekilde kontrol etmeyi sa\u011flar. Vuex, Vue.js ekosistemi i\u00e7in tasarlanm\u0131\u015f, bu t\u00fcr bir merkezi durum y\u00f6netim k\u00fct\u00fcphanesidir.<\/p>\n<h2>Vuex Nedir? Merkezi Durum Y\u00f6netimi Kavram\u0131<\/h2>\n<p>Vuex, Vue.js uygulamalar\u0131 i\u00e7in bir durum y\u00f6netim k\u00fct\u00fcphanesidir. Uygulaman\u0131n t\u00fcm bile\u015fenleri i\u00e7in merkezi bir depolama alan\u0131 (store) g\u00f6revi g\u00f6r\u00fcr. Bu, uygulaman\u0131n durumunun (state) tek bir yerde tutuldu\u011fu ve t\u00fcm bile\u015fenlerin bu durumu okuyabilece\u011fi veya belirli kurallar \u00e7er\u00e7evesinde g\u00fcncelleyebilece\u011fi anlam\u0131na gelir. Vuex, Redux&#8217;tan esinlenerek geli\u015ftirilmi\u015f olup, Flux mimarisinin temel prensiplerini benimser.<\/p>\n<p>Vuex&#8217;in temel amac\u0131, uygulaman\u0131n durumunu y\u00f6netilebilir, \u00f6ng\u00f6r\u00fclebilir ve hata ay\u0131klanabilir hale getirmektir. Bunu sa\u011flamak i\u00e7in &#8220;Tekil Kaynak (Single Source of Truth)&#8221; prensibini benimser. Yani, uygulaman\u0131n her yerindeki durum verisi, tek bir merkezi depoda bulunur. Bu durum, Vue&#8217;nun reaktif sistemi ile entegre \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in, depodaki herhangi bir veri de\u011fi\u015fti\u011finde, o veriyi kullanan t\u00fcm bile\u015fenler otomatik olarak g\u00fcncellenir.<\/p>\n<p>Vuex, durum y\u00f6netimini be\u015f temel bile\u015fen etraf\u0131nda yap\u0131land\u0131r\u0131r:<\/p>\n<ol>\n<li><strong>State:<\/strong> Uygulaman\u0131n reaktif durumunu tutar.<\/li>\n<li><strong>Getters:<\/strong> State&#8217;ten t\u00fcretilmi\u015f (computed) veriler sa\u011flar.<\/li>\n<li><strong>Mutations:<\/strong> State&#8217;i de\u011fi\u015ftiren tek yoldur ve senkron olmak zorundad\u0131r.<\/li>\n<li><strong>Actions:<\/strong> Asenkron i\u015flemleri (API \u00e7a\u011fr\u0131lar\u0131 gibi) i\u00e7erir ve Mutations&#8217;lar\u0131 \u00e7a\u011f\u0131rarak state&#8217;i g\u00fcnceller.<\/li>\n<li><strong>Modules:<\/strong> B\u00fcy\u00fck uygulamalarda store&#8217;u mod\u00fcler par\u00e7alara ay\u0131rmaya yarar.<\/li>\n<\/ol>\n<p>Bu bile\u015fenler, Vuex&#8217;in kat\u0131 bir veri ak\u0131\u015f\u0131 prensibini uygulamas\u0131n\u0131 sa\u011flar. Bu prensip sayesinde, uygulaman\u0131n herhangi bir an\u0131ndaki durumu kolayca takip edilebilir, de\u011fi\u015fikliklerin ne zaman ve nas\u0131l yap\u0131ld\u0131\u011f\u0131 net bir \u015fekilde anla\u015f\u0131labilir. Bu da \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda hata ay\u0131klama ve bak\u0131m s\u00fcre\u00e7lerini \u00f6nemli \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131r\u0131r.<\/p>\n<h2>Vuex&#8217;in Temel Bile\u015fenleri Detayl\u0131 \u0130nceleme<\/h2>\n<h3>State<\/h3>\n<p>State, Vuex store&#8217;unun kalbidir ve uygulaman\u0131n t\u00fcm reaktif durumunu bar\u0131nd\u0131r\u0131r. T\u0131pk\u0131 bir Vue bile\u015feninin <code>data<\/code> \u00f6zelli\u011fi gibi, state de do\u011frudan bile\u015fenler taraf\u0131ndan okunabilir ancak do\u011frudan de\u011fi\u015ftirilemez. State&#8217;teki herhangi bir de\u011fi\u015fiklik, bu state&#8217;i kullanan t\u00fcm bile\u015fenlerin otomatik olarak yeniden render edilmesini tetikler. Bu, Vue&#8217;nun reaktif sisteminin Vuex ile entegre \u00e7al\u0131\u015fmas\u0131n\u0131n bir sonucudur.<\/p>\n<p>State&#8217;i tan\u0131mlamak olduk\u00e7a basittir:<\/p>\n<pre><code class=\"language-javascript\">const store = new Vuex.Store({\n  state: {\n    count: 0,\n    isAuthenticated: false,\n    user: null,\n    products: []\n  }\n});\n<\/code><\/pre>\n<p>Bile\u015fenler i\u00e7inde state&#8217;e eri\u015fmenin birka\u00e7 yolu vard\u0131r. En yayg\u0131n y\u00f6ntemlerden biri, computed property kullanarak do\u011frudan eri\u015fim sa\u011flamakt\u0131r:<\/p>\n<pre><code class=\"language-javascript\">\/\/ Bir Vue bile\u015feni i\u00e7inde\nexport default {\n  computed: {\n    currentCount() {\n      return this.$store.state.count;\n    },\n    isLoggedIn() {\n      return this.$store.state.isAuthenticated;\n    }\n  }\n};\n<\/code><\/pre>\n<p>Daha d\u00fczenli ve okunabilir bir yol i\u00e7in <code>mapState<\/code> yard\u0131mc\u0131 fonksiyonu kullan\u0131labilir:<\/p>\n<pre><code class=\"language-javascript\">import { mapState } from 'vuex';\n\nexport default {\n  computed: {\n    ...mapState({\n      count: state => state.count,\n      \/\/ Veya do\u011frudan string olarak anahtar ad\u0131n\u0131 vererek\n      isAuthenticated: 'isAuthenticated' \n    }),\n    \/\/ Alternatif olarak, e\u011fer computed property ad\u0131 state anahtar\u0131yla ayn\u0131ysa\n    ...mapState(['count', 'isAuthenticated'])\n  }\n};\n<\/code><\/pre>\n<p><code>mapState<\/code>, bile\u015fen i\u00e7inde birden fazla state \u00f6zelli\u011fine eri\u015firken kod tekrar\u0131n\u0131 azalt\u0131r ve daha temiz bir yap\u0131 sunar.<\/p>\n<h3>Getters<\/h3>\n<p>Getters, Vuex store&#8217;undaki state&#8217;ten t\u00fcretilmi\u015f (computed) verileri sa\u011flamak i\u00e7in kullan\u0131l\u0131r. T\u0131pk\u0131 Vue bile\u015fenlerindeki computed properties gibi, getters da state de\u011fi\u015fti\u011finde otomatik olarak yeniden hesaplan\u0131r ve sonu\u00e7lar\u0131 \u00f6nbelle\u011fe al\u0131r. Getters, state&#8217;i do\u011frudan de\u011fi\u015ftirmemeli, sadece okuma ve t\u00fcretme i\u015flemleri yapmal\u0131d\u0131r.<\/p>\n<p>Getters&#8217;\u0131 kullanarak, uygulaman\u0131n farkl\u0131 yerlerinde ayn\u0131 hesaplamay\u0131 tekrar tekrar yapmaktan ka\u00e7\u0131nabilir ve kodun daha mod\u00fcler olmas\u0131n\u0131 sa\u011flayabiliriz. \u00d6rne\u011fin, bir \u00fcr\u00fcn listesinden sadece aktif \u00fcr\u00fcnleri filtrelemek veya bir say\u0131sal de\u011feri formatlamak gibi i\u015flemler getters arac\u0131l\u0131\u011f\u0131yla yap\u0131labilir.<\/p>\n<p>Getters tan\u0131mlama:<\/p>\n<pre><code class=\"language-javascript\">const store = new Vuex.Store({\n  state: {\n    todos: [\n      { id: 1, text: 'Vuex \u00f6\u011fren', done: true },\n      { id: 2, text: 'Makale yaz', done: false }\n    ]\n  },\n  getters: {\n    doneTodos: state => {\n      return state.todos.filter(todo => todo.done);\n    },\n    doneTodosCount: (state, getters) => {\n      return getters.doneTodos.length;\n    },\n    getTodoById: (state) => (id) => {\n      return state.todos.find(todo => todo.id === id);\n    }\n  }\n});\n<\/code><\/pre>\n<p>Bile\u015fenlerden getters&#8217;a eri\u015fim:<\/p>\n<pre><code class=\"language-javascript\">\/\/ Bir Vue bile\u015feni i\u00e7inde\nexport default {\n  computed: {\n    completedTodos() {\n      return this.$store.getters.doneTodos;\n    },\n    specificTodo() {\n      return this.$store.getters.getTodoById(1);\n    }\n  }\n};\n<\/code><\/pre>\n<p>Yine, <code>mapGetters<\/code> yard\u0131mc\u0131 fonksiyonu ile daha temiz bir eri\u015fim sa\u011flanabilir:<\/p>\n<pre><code class=\"language-javascript\">import { mapGetters } from 'vuex';\n\nexport default {\n  computed: {\n    ...mapGetters([\n      'doneTodos',\n      'doneTodosCount'\n    ])\n  }\n};\n<\/code><\/pre>\n<h3>Mutations<\/h3>\n<p>Mutations, Vuex store&#8217;undaki state&#8217;i de\u011fi\u015ftiren tek yoldur. Vuex&#8217;in en kat\u0131 kurallar\u0131ndan biridir: state&#8217;i do\u011frudan de\u011fi\u015ftirmek yerine her zaman bir mutation commit etmelisiniz. Mutations&#8217;lar senkron olmak zorundad\u0131r; bu, bir mutation&#8217;\u0131n \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda state&#8217;i an\u0131nda de\u011fi\u015ftirmesi ve herhangi bir asenkron i\u015flem i\u00e7ermemesi gerekti\u011fi anlam\u0131na gelir. Bu kural, Vuex Devtools gibi ara\u00e7lar\u0131n state de\u011fi\u015fikliklerini do\u011fru bir \u015fekilde izlemesini ve zaman yolculu\u011fu hata ay\u0131klamas\u0131n\u0131 (time-travel debugging) m\u00fcmk\u00fcn k\u0131lar.<\/p>\n<p>Her mutation&#8217;\u0131n bir tipi (string bir isim) ve bir handler fonksiyonu vard\u0131r. Handler fonksiyonu ilk arg\u00fcman olarak state&#8217;i al\u0131r. \u0130kinci bir arg\u00fcman olarak, iste\u011fe ba\u011fl\u0131 bir &#8220;payload&#8221; (veri) alabilir. Payload, tek bir obje olmal\u0131d\u0131r, bu da birden fazla veri g\u00f6ndermeniz gerekti\u011finde i\u015fleri kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>Mutations tan\u0131mlama:<\/p>\n<pre><code class=\"language-javascript\">const store = new Vuex.Store({\n  state: {\n    count: 0\n  },\n  mutations: {\n    increment(state) {\n      state.count++;\n    },\n    decrement(state) {\n      state.count--;\n    },\n    add(state, amount) { \/\/ amount bir payload'd\u0131r\n      state.count += amount;\n    },\n    setAuthentication(state, status) {\n      state.isAuthenticated = status;\n    }\n  }\n});\n<\/code><\/pre>\n<p>Mutations&#8217;lar\u0131 \u00e7a\u011f\u0131rmak i\u00e7in <code>store.commit()<\/code> metodunu kullan\u0131r\u0131z:<\/p>\n<pre><code class=\"language-javascript\">\/\/ Bir Vue bile\u015feni i\u00e7inde\nexport default {\n  methods: {\n    incrementCount() {\n      this.$store.commit('increment');\n    },\n    addAmount(amount) {\n      this.$store.commit('add', amount);\n    },\n    login() {\n      this.$store.commit('setAuthentication', true);\n    }\n  }\n};\n<\/code><\/pre>\n<p><code>mapMutations<\/code> yard\u0131mc\u0131 fonksiyonu ile daha k\u0131sa bir kullan\u0131m sa\u011flanabilir:<\/p>\n<pre><code class=\"language-javascript\">import { mapMutations } from 'vuex';\n\nexport default {\n  methods: {\n    ...mapMutations([\n      'increment', \/\/ this.increment() olarak e\u015flenir\n      'decrement',\n      'add' \/\/ this.add(amount) olarak e\u015flenir\n    ]),\n    \/\/ Veya \u00f6zel isimle e\u015fleme\n    ...mapMutations({\n      addAmount: 'add' \/\/ this.addAmount(amount) olarak e\u015flenir\n    })\n  }\n};\n<\/code><\/pre>\n<h3>Actions<\/h3>\n<p>Actions, asenkron i\u015flemleri (API \u00e7a\u011fr\u0131lar\u0131, zamanlay\u0131c\u0131lar vb.) ger\u00e7ekle\u015ftirmek ve ard\u0131ndan state&#8217;i de\u011fi\u015ftirmek i\u00e7in Mutations&#8217;lar\u0131 \u00e7a\u011f\u0131rmakla sorumludur. Actions, state&#8217;i do\u011frudan de\u011fi\u015ftiremez; bunun yerine bir veya daha fazla Mutation&#8217;\u0131 commit eder. Bu ayr\u0131m, uygulaman\u0131n i\u015f mant\u0131\u011f\u0131n\u0131 ve veri ak\u0131\u015f\u0131n\u0131 daha net bir \u015fekilde organize etmeye yard\u0131mc\u0131 olur.<\/p>\n<p>Her action&#8217;\u0131n bir tipi ve bir handler fonksiyonu vard\u0131r. Handler fonksiyonu ilk arg\u00fcman olarak bir <code>context<\/code> objesi al\u0131r. Bu <code>context<\/code> objesi, ayn\u0131 store \u00f6rne\u011finin metot ve \u00f6zelliklerine (<code>state<\/code>, <code>getters<\/code>, <code>commit<\/code>, <code>dispatch<\/code>) eri\u015fim sa\u011flar. Bu sayede, bir action i\u00e7inde ba\u015fka action&#8217;lar\u0131 dispatch edebilir veya mutation&#8217;lar\u0131 commit edebiliriz.<\/p>\n<p>Actions tan\u0131mlama:<\/p>\n<pre><code class=\"language-javascript\">const store = new Vuex.Store({\n  state: {\n    count: 0,\n    userData: null,\n    loading: false,\n    error: null\n  },\n  mutations: {\n    increment(state) {\n      state.count++;\n    },\n    setUserData(state, data) {\n      state.userData = data;\n    },\n    setLoading(state, status) {\n      state.loading = status;\n    },\n    setError(state, error) {\n      state.error = error;\n    }\n  },\n  actions: {\n    asyncIncrement(context) {\n      setTimeout(() => {\n        context.commit('increment');\n      }, 1000);\n    },\n    async fetchUser({ commit }) { \/\/ context objesini destructure edebiliriz\n      commit('setLoading', true);\n      commit('setError', null);\n      try {\n        const response = await fetch('https:\/\/api.example.com\/user');\n        const data = await response.json();\n        commit('setUserData', data);\n      } catch (error) {\n        commit('setError', 'Kullan\u0131c\u0131 verisi \u00e7ekilemedi.');\n      } finally {\n        commit('setLoading', false);\n      }\n    },\n    loginUser({ commit, dispatch }, credentials) {\n      \/\/ API \u00e7a\u011fr\u0131s\u0131 ile login i\u015flemi\n      \/\/ Ba\u015far\u0131l\u0131 olursa commit('setAuthentication', true)\n      \/\/ Sonra belki dispatch('fetchUser') gibi ba\u015fka bir action \u00e7a\u011fr\u0131labilir\n    }\n  }\n});\n<\/code><\/pre>\n<p>Actions&#8217;lar\u0131 \u00e7a\u011f\u0131rmak i\u00e7in <code>store.dispatch()<\/code> metodunu kullan\u0131r\u0131z:<\/p>\n<pre><code class=\"language-javascript\">\/\/ Bir Vue bile\u015feni i\u00e7inde\nexport default {\n  methods: {\n    triggerAsyncIncrement() {\n      this.$store.dispatch('asyncIncrement');\n    },\n    loadUserData() {\n      this.$store.dispatch('fetchUser');\n    },\n    handleLogin(credentials) {\n      this.$store.dispatch('loginUser', credentials);\n    }\n  }\n};\n<\/code><\/pre>\n<p><code>mapActions<\/code> yard\u0131mc\u0131 fonksiyonu ile daha k\u0131sa bir kullan\u0131m sa\u011flanabilir:<\/p>\n<pre><code class=\"language-javascript\">import { mapActions } from 'vuex';\n\nexport default {\n  methods: {\n    ...mapActions([\n      'asyncIncrement',\n      'fetchUser'\n    ]),\n    \/\/ Veya \u00f6zel isimle e\u015fleme\n    ...mapActions({\n      loadUser: 'fetchUser' \/\/ this.loadUser() olarak e\u015flenir\n    })\n  }\n};\n<\/code><\/pre>\n<h2>Vuex Kurulumu ve Basit Bir \u00d6rnek<\/h2>\n<p>Vuex&#8217;i bir Vue.js uygulamas\u0131na entegre etmek olduk\u00e7a basittir.<\/p>\n<p><strong>1. Kurulum:<\/strong><\/p>\n<p>\u00d6ncelikle Vuex paketini projenize eklemeniz gerekir:<\/p>\n<pre><code class=\"language-bash\">npm install vuex --save\n<h2>veya<\/h2>\nyarn add vuex\n<\/code><\/pre>\n<p><strong>2. Store Olu\u015fturma:<\/strong><\/p>\n<p>Genellikle projenizin k\u00f6k dizininde bir <code>store<\/code> klas\u00f6r\u00fc olu\u015fturulur ve i\u00e7ine <code>index.js<\/code> dosyas\u0131 konulur. Bu dosya, Vuex store&#8217;unuzu i\u00e7erecektir.<\/p>\n<pre><code class=\"language-javascript\">\/\/ store\/index.js\nimport { createStore } from 'vuex'; \/\/ Vue 3 i\u00e7in createStore\n\nconst store = createStore({\n  state: {\n    count: 0\n  },\n  getters: {\n    doubleCount: state => state.count * 2\n  },\n  mutations: {\n    increment(state) {\n      state.count++;\n    },\n    add(state, amount) {\n      state.count += amount;\n    }\n  },\n  actions: {\n    asyncIncrement(context) {\n      return new Promise(resolve => {\n        setTimeout(() => {\n          context.commit('increment');\n          resolve();\n        }, 1000);\n      });\n    },\n    asyncAdd({ commit }, amount) {\n      return new Promise(resolve => {\n        setTimeout(() => {\n          commit('add', amount);\n          resolve();\n        }, 500);\n      });\n    }\n  }\n});\n\nexport default store;\n<\/code><\/pre>\n<p><strong>3. Vue Uygulamas\u0131na Entegrasyon:<\/strong><\/p>\n<p>Store&#8217;u ana Vue uygulamas\u0131na eklemeniz gerekir. Bu genellikle <code>main.js<\/code> (Vue 3) veya <code>main.js<\/code>\/<code>app.js<\/code> (Vue 2) dosyas\u0131nda yap\u0131l\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\/\/ main.js (Vue 3)\nimport { createApp } from 'vue';\nimport App from '.\/App.vue';\nimport store from '.\/store'; \/\/ Store'u import et\n\ncreateApp(App).use(store).mount('#app'); \/\/ .use(store) ile entegre et\n<\/code><\/pre>\n<p><strong>4. Bile\u015fenlerde Kullan\u0131m:<\/strong><\/p>\n<p>\u015eimdi bir bile\u015fen i\u00e7inde bu store&#8217;u nas\u0131l kullanaca\u011f\u0131m\u0131za bakal\u0131m. Basit bir saya\u00e7 bile\u015feni olu\u015fturabiliriz:<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <h2>Saya\u00e7: {{ count }}<\/h2>\n    <p>\u00c7ift Say\u0131: {{ doubleCount }}<\/p>\n    <button @click=\"increment\">Artt\u0131r<\/button>\n    <button @click=\"add(5)\">5 Ekle<\/button>\n    <button @click=\"asyncIncrement\">Asenkron Artt\u0131r<\/button>\n    <button @click=\"asyncAdd(10)\">Asenkron 10 Ekle<\/button>\n  <\/div>\n<\/template>\n\n<script>\nimport { mapState, mapGetters, mapMutations, mapActions } from 'vuex';\n\nexport default {\n  name: 'CounterComponent',\n  computed: {\n    ...mapState(['count']),\n    ...mapGetters(['doubleCount'])\n  },\n  methods: {\n    ...mapMutations(['increment', 'add']),\n    ...mapActions(['asyncIncrement', 'asyncAdd'])\n  }\n};\n<\/script>\n<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>mapState<\/code> ve <code>mapGetters<\/code> ile store&#8217;daki verilere eri\u015firken, <code>mapMutations<\/code> ve <code>mapActions<\/code> ile state&#8217;i de\u011fi\u015ftiren metotlar\u0131 bile\u015fenimize dahil ettik. Bu sayede, bile\u015fenimiz hem store&#8217;daki g\u00fcncel duruma reaktif bir \u015fekilde eri\u015febilir hem de merkezi olarak tan\u0131mlanm\u0131\u015f metotlar arac\u0131l\u0131\u011f\u0131yla durumu g\u00fcvenli bir \u015fekilde g\u00fcncelleyebilir.<\/p>\n<h2>Mod\u00fcller (Modules): B\u00fcy\u00fck Uygulamalar \u0130\u00e7in Yap\u0131land\u0131rma<\/h2>\n<p>Uygulama b\u00fcy\u00fcd\u00fck\u00e7e, t\u00fcm state, getters, mutations ve actions&#8217;lar\u0131 tek bir Vuex store dosyas\u0131nda tutmak y\u00f6netilemez hale gelebilir. Dosya boyutu artar, ilgili kod par\u00e7alar\u0131n\u0131 bulmak zorla\u015f\u0131r ve farkl\u0131 geli\u015ftiricilerin ayn\u0131 dosya \u00fczerinde \u00e7al\u0131\u015fmas\u0131 \u00e7ak\u0131\u015fmalara yol a\u00e7abilir. Vuex, bu sorunu \u00e7\u00f6zmek i\u00e7in mod\u00fcller kavram\u0131n\u0131 sunar.<\/p>\n<p>Mod\u00fcller, b\u00fcy\u00fck bir store&#8217;u daha k\u00fc\u00e7\u00fck, kendi kendine yeten ve yeniden kullan\u0131labilir par\u00e7alara b\u00f6lmenizi sa\u011flar. Her mod\u00fcl, kendi state, getters, mutations ve actions&#8217;lar\u0131na sahip olabilir. Mod\u00fcller, i\u00e7 i\u00e7e de yerle\u015ftirilebilir, bu da uygulaman\u0131n hiyerar\u015fik yap\u0131s\u0131n\u0131 store&#8217;a yans\u0131tman\u0131za olanak tan\u0131r.<\/p>\n<p><strong>Mod\u00fcl Tan\u0131mlama:<\/strong><\/p>\n<p>\u00d6rne\u011fin, bir kimlik do\u011frulama (auth) mod\u00fcl\u00fc ve bir \u00fcr\u00fcnler (products) mod\u00fcl\u00fc olu\u015fturabiliriz:<\/p>\n<pre><code class=\"language-javascript\">\/\/ store\/modules\/auth.js\nconst authModule = {\n  namespaced: true, \/\/ Mod\u00fcl\u00fcn kendi isim alan\u0131na sahip olmas\u0131n\u0131 sa\u011flar\n  state: () => ({\n    isAuthenticated: false,\n    user: null,\n    token: null\n  }),\n  getters: {\n    isLoggedIn: state => state.isAuthenticated,\n    currentUser: state => state.user\n  },\n  mutations: {\n    setAuthentication(state, status) {\n      state.isAuthenticated = status;\n    },\n    setUser(state, user) {\n      state.user = user;\n    },\n    setToken(state, token) {\n      state.token = token;\n    }\n  },\n  actions: {\n    async login({ commit }, credentials) {\n      \/\/ API \u00e7a\u011fr\u0131s\u0131\n      const response = await fetch('\/api\/login', { \/<em> ... <\/em>\/ });\n      const data = await response.json();\n      commit('setAuthentication', true);\n      commit('setUser', data.user);\n      commit('setToken', data.token);\n      return data;\n    },\n    logout({ commit }) {\n      commit('setAuthentication', false);\n      commit('setUser', null);\n      commit('setToken', null);\n    }\n  }\n};\n\nexport default authModule;\n<\/code><\/pre>\n<pre><code class=\"language-javascript\">\/\/ store\/modules\/products.js\nconst productsModule = {\n  namespaced: true,\n  state: () => ({\n    allProducts: [],\n    selectedProduct: null\n  }),\n  getters: {\n    availableProducts: state => state.allProducts.filter(p => p.inStock > 0),\n    productCount: state => state.allProducts.length\n  },\n  mutations: {\n    setProducts(state, products) {\n      state.allProducts = products;\n    },\n    selectProduct(state, product) {\n      state.selectedProduct = product;\n    }\n  },\n  actions: {\n    async fetchProducts({ commit }) {\n      const response = await fetch('\/api\/products');\n      const products = await response.json();\n      commit('setProducts', products);\n    }\n  }\n};\n\nexport default productsModule;\n<\/code><\/pre>\n<p><strong>K\u00f6k Store&#8217;a Ekleme:<\/strong><\/p>\n<p>Mod\u00fclleri k\u00f6k store&#8217;unuza \u015fu \u015fekilde eklersiniz:<\/p>\n<pre><code class=\"language-javascript\">\/\/ store\/index.js\nimport { createStore } from 'vuex';\nimport auth from '.\/modules\/auth';\nimport products from '.\/modules\/products';\n\nconst store = createStore({\n  modules: {\n    auth,\n    products\n  }\n});\n\nexport default store;\n<\/code><\/pre>\n<p><strong>Mod\u00fcllere Eri\u015fim:<\/strong><\/p>\n<p><code>namespaced: true<\/code> \u00f6zelli\u011fi sayesinde, her mod\u00fcl kendi isim alan\u0131na sahip olur. Bu, \u00e7ak\u0131\u015fmalar\u0131 \u00f6nler ve hangi mod\u00fcl\u00fcn hangi eylemi veya durumu y\u00f6netti\u011fini netle\u015ftirir. Bile\u015fenlerden mod\u00fcl elemanlar\u0131na eri\u015firken mod\u00fcl ad\u0131n\u0131 kullan\u0131r\u0131z:<\/p>\n<pre><code class=\"language-javascript\">\/\/ Bile\u015fen i\u00e7inde\nimport { mapState, mapGetters, mapActions } from 'vuex';\n\nexport default {\n  computed: {\n    \/\/ auth mod\u00fcl\u00fcnden state ve getter'lar\n    ...mapState('auth', ['isAuthenticated', 'user']),\n    ...mapGetters('auth', ['isLoggedIn', 'currentUser']),\n\n    \/\/ products mod\u00fcl\u00fcnden state ve getter'lar\n    ...mapState('products', ['allProducts']),\n    ...mapGetters('products', ['availableProducts'])\n  },\n  methods: {\n    \/\/ auth mod\u00fcl\u00fcnden action'lar\n    ...mapActions('auth', ['login', 'logout']),\n\n    \/\/ products mod\u00fcl\u00fcnden action'lar\n    ...mapActions('products', ['fetchProducts'])\n  },\n  created() {\n    this.fetchProducts(); \/\/ products\/fetchProducts action'\u0131n\u0131 \u00e7a\u011f\u0131r\u0131r\n  }\n};\n<\/code><\/pre>\n<p>Mod\u00fcller, uygulaman\u0131n karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131k\u00e7a store&#8217;u d\u00fczenli ve y\u00f6netilebilir tutmak i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r. Her mod\u00fcl, uygulaman\u0131n belirli bir alan\u0131yla ilgili durumu ve mant\u0131\u011f\u0131 kaps\u00fclleyerek geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r ve hatalar\u0131 azalt\u0131r.<\/p>\n<h2>Vuex ile En \u0130yi Uygulamalar ve \u0130pu\u00e7lar\u0131<\/h2>\n<p>Vuex kullan\u0131rken uygulaman\u0131z\u0131n performans\u0131n\u0131 ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131rmak i\u00e7in baz\u0131 en iyi uygulamalar\u0131 takip etmek \u00f6nemlidir:<\/p>\n<ol>\n<li><strong>Durumu Atomik ve \u0130zole Tutun:<\/strong> State&#8217;i m\u00fcmk\u00fcn oldu\u011funca k\u00fc\u00e7\u00fck, ba\u011f\u0131ms\u0131z ve tek bir sorumlulu\u011fa sahip par\u00e7alara ay\u0131r\u0131n. Gereksiz yere b\u00fcy\u00fck ve karma\u015f\u0131k state objelerinden ka\u00e7\u0131n\u0131n.<\/li>\n<li><strong>Mutations&#8217;lar\u0131 Sadece State De\u011fi\u015fimi \u0130\u00e7in Kullan\u0131n:<\/strong> Mutations&#8217;lar senkron olmal\u0131 ve yaln\u0131zca state&#8217;i de\u011fi\u015ftirmelidir. \u0130\u015f mant\u0131\u011f\u0131 veya asenkron i\u015flemler i\u00e7ermemelidirler. Bu, state de\u011fi\u015fikliklerinin izlenebilirli\u011fini ve hata ay\u0131klamas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/li>\n<li><strong>Actions&#8217;lar\u0131 \u0130\u015f Mant\u0131\u011f\u0131 \u0130\u00e7in Kullan\u0131n:<\/strong> API \u00e7a\u011fr\u0131lar\u0131, veri i\u015fleme, birden fazla mutation&#8217;\u0131 \u00e7a\u011f\u0131rma veya ba\u015fka action&#8217;lar\u0131 dispatch etme gibi t\u00fcm asenkron ve karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131n\u0131 actions&#8217;larda tutun.<\/li>\n<li><strong>Getters&#8217;\u0131 T\u00fcretilmi\u015f Veriler \u0130\u00e7in Kullan\u0131n:<\/strong> State&#8217;ten t\u00fcretilmi\u015f, hesaplanm\u0131\u015f veya filtrelenmi\u015f verilere ihtiya\u00e7 duydu\u011funuzda getters kullan\u0131n. Bu, kod tekrar\u0131n\u0131 \u00f6nler ve performans\u0131 art\u0131r\u0131r (getters sonu\u00e7lar\u0131 \u00f6nbelle\u011fe al\u0131r).<\/li>\n<li><strong>B\u00fcy\u00fck Uygulamalarda Mod\u00fcl Kullan\u0131n:<\/strong> Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e ve store&#8217;unuz karma\u015f\u0131kla\u015ft\u0131k\u00e7a, mod\u00fcller arac\u0131l\u0131\u011f\u0131yla store&#8217;u mant\u0131ksal olarak b\u00f6l\u00fcn. Bu, kodun okunabilirli\u011fini, bak\u0131m\u0131n\u0131 ve ekip \u00e7al\u0131\u015fmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r. <code>namespaced: true<\/code> kullanarak isim alan\u0131 \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nleyin.<\/li>\n<li><strong>Vuex Devtools Kullan\u0131n:<\/strong> Vuex Devtools, Vuex ile geli\u015ftirme yaparken en g\u00fc\u00e7l\u00fc ara\u00e7lardan biridir. State&#8217;i ger\u00e7ek zamanl\u0131 olarak izlemenizi, mutation&#8217;lar\u0131 ve action&#8217;lar\u0131 g\u00f6rmenizi, hatta &#8220;zaman yolculu\u011fu&#8221; (time-travel debugging) yaparak \u00f6nceki state&#8217;lere geri d\u00f6nmenizi sa\u011flar. Bu, hata ay\u0131klama s\u00fcrecini inan\u0131lmaz derecede h\u0131zland\u0131r\u0131r.<\/li>\n<li><strong>Payload&#8217;lar\u0131 Objeler Olarak G\u00f6nderin:<\/strong> Mutations ve actions&#8217;lara birden fazla veri g\u00f6ndermeniz gerekti\u011finde, tek bir obje olarak payload g\u00f6ndermek daha okunabilir ve esnektir. \u00d6rne\u011fin: <code>commit('updateUser', { id: 1, name: 'Yeni \u0130sim' })<\/code>.<\/li>\n<li><strong>State De\u011fi\u015fikliklerini \u0130zlenebilir Tutun:<\/strong> Asla state&#8217;i do\u011frudan bir bile\u015fen i\u00e7inde de\u011fi\u015ftirmeyin. Her zaman bir mutation commit edin. Bu, Vuex&#8217;in temel prensiplerinden biridir ve uygulaman\u0131z\u0131n durumunun \u00f6ng\u00f6r\u00fclebilirli\u011fini sa\u011flar.<\/li>\n<li><strong>Test Edilebilirlik:<\/strong> Mod\u00fcller, actions ve mutations gibi par\u00e7alar\u0131 izole bir \u015fekilde test etmek kolayd\u0131r. Bu, uygulaman\u0131z\u0131n g\u00fcvenilirli\u011fini art\u0131r\u0131r.<\/li>\n<li><strong>Alternatifleri De\u011ferlendirin (Pinia\/Composition API):<\/strong> Vue 3 ve Composition API ile birlikte, Vuex&#8217;e alternatif olarak Pinia gibi daha hafif ve daha modern durum y\u00f6netim k\u00fct\u00fcphaneleri ortaya \u00e7\u0131km\u0131\u015ft\u0131r. Pinia, Vuex&#8217;in bir\u00e7ok avantaj\u0131n\u0131 korurken daha basit bir API ve daha iyi TypeScript deste\u011fi sunar. K\u00fc\u00e7\u00fck veya orta \u00f6l\u00e7ekli uygulamalar i\u00e7in Composition API&#8217;nin <code>ref<\/code> ve <code>reactive<\/code> ile sa\u011flad\u0131\u011f\u0131 basit durum y\u00f6netimi de yeterli olabilir. Vuex&#8217;in ne zaman ger\u00e7ekten gerekli oldu\u011funu de\u011ferlendirin.<\/li>\n<\/ol>\n<h2>Vuex&#8217;in Avantajlar\u0131 ve Dezavantajlar\u0131<\/h2>\n<p>Her teknoloji gibi, Vuex&#8217;in de kendi avantajlar\u0131 ve dezavantajlar\u0131 vard\u0131r. Uygulaman\u0131z i\u00e7in do\u011fru durum y\u00f6netim \u00e7\u00f6z\u00fcm\u00fcn\u00fc se\u00e7erken bunlar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir.<\/p>\n<h3>Avantajlar<\/h3>\n<ul>\n<li><strong>Merkezi Durum Y\u00f6netimi:<\/strong> Uygulaman\u0131n t\u00fcm durumunu tek bir yerde toplar, bu da veri ak\u0131\u015f\u0131n\u0131 ve y\u00f6netimini basitle\u015ftirir.<\/li>\n<li><strong>Daha \u00d6ng\u00f6r\u00fclebilir Durum De\u011fi\u015fimleri:<\/strong> Kat\u0131 kurallar\u0131 (state sadece mutations ile de\u011fi\u015ftirilebilir, mutations senkron olmal\u0131) sayesinde, uygulaman\u0131n durumu her zaman \u00f6ng\u00f6r\u00fclebilir bir \u015fekilde de\u011fi\u015fir. Bu, hatalar\u0131 bulmay\u0131 ve d\u00fczeltmeyi kolayla\u015ft\u0131r\u0131r.<\/li>\n<li><strong>Geli\u015ftirici Ara\u00e7lar\u0131 (Devtools):<\/strong> Vuex Devtools, state de\u011fi\u015fikliklerini izlemek, ge\u00e7mi\u015fe d\u00f6n\u00fck hata ay\u0131klama yapmak ve uygulaman\u0131n durumunu anl\u0131k olarak g\u00f6rmek i\u00e7in g\u00fc\u00e7l\u00fc \u00f6zellikler sunar.<\/li>\n<li><strong>B\u00fcy\u00fck Uygulamalarda \u00d6l\u00e7eklenebilirlik:<\/strong> Mod\u00fcller sayesinde, b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalar\u0131n durum y\u00f6netimini mant\u0131ksal par\u00e7alara ay\u0131rarak daha y\u00f6netilebilir hale getirir.<\/li>\n<li><strong>Bak\u0131m Kolayl\u0131\u011f\u0131:<\/strong> Belirli bir verinin nereden geldi\u011fini veya nas\u0131l de\u011fi\u015fti\u011fini anlamak \u00e7ok daha kolayd\u0131r, bu da uzun vadede uygulaman\u0131n bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/li>\n<li><strong>Ekip \u00c7al\u0131\u015fmas\u0131:<\/strong> Birden fazla geli\u015ftiricinin ayn\u0131 proje \u00fczerinde \u00e7al\u0131\u015f\u0131rken veri ak\u0131\u015f\u0131 ve durumu konusunda tutarl\u0131 bir yakla\u015f\u0131m benimsemesini sa\u011flar.<\/li>\n<\/ul>\n<h3>Dezavantajlar<\/h3>\n<ul>\n<li><strong>K\u00fc\u00e7\u00fck Uygulamalar \u0130\u00e7in Gereksiz Karma\u015f\u0131kl\u0131k:<\/strong> \u00c7ok basit ve az say\u0131da bile\u015feni olan uygulamalar i\u00e7in Vuex&#8217;in getirdi\u011fi ek soyutlama katman\u0131 ve \u00f6\u011frenme e\u011frisi gereksiz olabilir. Props ve events yeterli olabilir.<\/li>\n<li><strong>\u00d6\u011frenme E\u011frisi:<\/strong> Vuex&#8217;in temel prensipleri (state, getters, mutations, actions, modules) yeni ba\u015flayanlar i\u00e7in anla\u015f\u0131lmas\u0131 zaman alabilir.<\/li>\n<li><strong>Ekstra Kod Y\u00fck\u00fc:<\/strong> Vuex&#8217;i kullanmak, standart Vue.js uygulamas\u0131na g\u00f6re daha fazla boilerplate kodu yazmay\u0131 gerektirir. Her state de\u011fi\u015fikli\u011fi i\u00e7in bir mutation ve muhtemelen bir action yazman\u0131z gerekir.<\/li>\n<li><strong>Performans Maliyeti (Baz\u0131 Durumlarda):<\/strong> \u00c7ok s\u0131k ve k\u00fc\u00e7\u00fck state de\u011fi\u015fiklikleri olan senaryolarda, Vuex&#8217;in reaktif sistemi ve izleme mekanizmalar\u0131 hafif bir performans maliyetine yol a\u00e7abilir. Ancak \u00e7o\u011fu uygulama i\u00e7in bu fark ihmal edilebilir d\u00fczeydedir.<\/li>\n<\/ul>\n<h2>Sonu\u00e7<\/h2>\n<p>Vue.js uygulamalar\u0131nda durum y\u00f6netimi, \u00f6zellikle uygulama b\u00fcy\u00fcd\u00fck\u00e7e ve karma\u015f\u0131kla\u015ft\u0131k\u00e7a hayati bir \u00f6neme sahiptir. Vuex, bu zorlu\u011fun \u00fcstesinden gelmek i\u00e7in g\u00fc\u00e7l\u00fc ve yap\u0131land\u0131r\u0131lm\u0131\u015f bir \u00e7\u00f6z\u00fcm sunar. Merkezi bir depolama alan\u0131, \u00f6ng\u00f6r\u00fclebilir veri ak\u0131\u015f\u0131 prensipleri ve g\u00fc\u00e7l\u00fc geli\u015ftirici ara\u00e7lar\u0131 ile Vuex, b\u00fcy\u00fck \u00f6l\u00e7ekli ve s\u00fcrd\u00fcr\u00fclebilir Vue.js uygulamalar\u0131 geli\u015ftirmek i\u00e7in vazge\u00e7ilmez bir ara\u00e7 haline gelmi\u015ftir.<\/p>\n<p>Vuex&#8217;in sundu\u011fu state, getters, mutations, actions ve modules gibi bile\u015fenler, uygulaman\u0131n durumunu mant\u0131ksal olarak d\u00fczenlemenize, asenkron i\u015flemleri y\u00f6netmenize ve state de\u011fi\u015fikliklerini g\u00fcvenli bir \u015fekilde ger\u00e7ekle\u015ftirmenize olanak tan\u0131r. Mod\u00fcller sayesinde, store&#8217;u daha k\u00fc\u00e7\u00fck, y\u00f6netilebilir par\u00e7alara ay\u0131rabilir ve ekip \u00e7al\u0131\u015fmas\u0131n\u0131 kolayla\u015ft\u0131rabilirsiniz.<\/p>\n<p>Ancak, her projede Vuex kullanmak \u015fart de\u011fildir. Uygulaman\u0131z\u0131n boyutu ve karma\u015f\u0131kl\u0131\u011f\u0131na g\u00f6re durum y\u00f6netimi stratejinizi belirlemelisiniz. K\u00fc\u00e7\u00fck uygulamalar i\u00e7in Vue&#8217;nun kendi props ve event mekanizmalar\u0131 veya Composition API ile basit bir durum y\u00f6netimi yeterli olabilir. Ancak, uygulaman\u0131zda birden fazla bile\u015fenin ayn\u0131 veriye eri\u015fmesi ve g\u00fcncellemesi gerekiyorsa, global bir durum ihtiyac\u0131 varsa ve uygulaman\u0131z\u0131n gelecekte b\u00fcy\u00fcme potansiyeli varsa, Vuex g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<p>Vue 3 ile birlikte Pinia gibi yeni nesil durum y\u00f6netim k\u00fct\u00fcphaneleri de pop\u00fclerlik kazanm\u0131\u015ft\u0131r. Pinia, Vuex&#8217;in bir\u00e7ok avantaj\u0131n\u0131 daha basit bir API ve daha iyi TypeScript deste\u011fi ile sunarak modern Vue uygulamalar\u0131 i\u00e7in cazip bir alternatif haline gelmi\u015ftir. Gelecekteki projelerinizde hem Vuex&#8217;i hem de Pinia&#8217;y\u0131 de\u011ferlendirerek projenizin \u00f6zel ihtiya\u00e7lar\u0131na en uygun \u00e7\u00f6z\u00fcm\u00fc se\u00e7ebilirsiniz. Unutmay\u0131n, do\u011fru arac\u0131 se\u00e7mek, ba\u015far\u0131l\u0131 bir uygulama geli\u015ftirmenin anahtarlar\u0131ndan biridir.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Vue.js Uygulamalar\u0131nda Durum Y\u00f6netimi: Vuex ile Kapsaml\u0131 Bir Yakla\u015f\u0131m\nModern web uygulamalar\u0131, kullan\u0131c\u0131 aray\u00fczlerinin karma\u015f\u0131kl\u0131\u011f\u0131 ve","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-32050","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 Uygulamalar\u0131nda Durum Y\u00f6netimi: Vuex ile Kapsaml\u0131 Bir Yakla\u015f\u0131m - 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-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vue.js Uygulamalar\u0131nda Durum Y\u00f6netimi: Vuex ile Kapsaml\u0131 Bir Yakla\u015f\u0131m\" \/>\n<meta property=\"og:description\" content=\"Vue.js Uygulamalar\u0131nda Durum Y\u00f6netimi: Vuex ile Kapsaml\u0131 Bir Yakla\u015f\u0131m Modern web uygulamalar\u0131, kullan\u0131c\u0131 aray\u00fczlerinin karma\u015f\u0131kl\u0131\u011f\u0131 ve\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-17T01:41:04+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=\"19 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-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Vue.js Uygulamalar\u0131nda Durum Y\u00f6netimi: Vuex ile Kapsaml\u0131 Bir Yakla\u015f\u0131m\",\"datePublished\":\"2025-10-17T01:41:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/\"},\"wordCount\":2962,\"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-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/\",\"name\":\"Vue.js Uygulamalar\u0131nda Durum Y\u00f6netimi: Vuex ile Kapsaml\u0131 Bir Yakla\u015f\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-17T01:41:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vue.js Uygulamalar\u0131nda Durum Y\u00f6netimi: Vuex ile Kapsaml\u0131 Bir Yakla\u015f\u0131m\"}]},{\"@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 Uygulamalar\u0131nda Durum Y\u00f6netimi: Vuex ile Kapsaml\u0131 Bir Yakla\u015f\u0131m - 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-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/","og_locale":"tr_TR","og_type":"article","og_title":"Vue.js Uygulamalar\u0131nda Durum Y\u00f6netimi: Vuex ile Kapsaml\u0131 Bir Yakla\u015f\u0131m","og_description":"Vue.js Uygulamalar\u0131nda Durum Y\u00f6netimi: Vuex ile Kapsaml\u0131 Bir Yakla\u015f\u0131m Modern web uygulamalar\u0131, kullan\u0131c\u0131 aray\u00fczlerinin karma\u015f\u0131kl\u0131\u011f\u0131 ve","og_url":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-17T01:41:04+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"19 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Vue.js Uygulamalar\u0131nda Durum Y\u00f6netimi: Vuex ile Kapsaml\u0131 Bir Yakla\u015f\u0131m","datePublished":"2025-10-17T01:41:04+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/"},"wordCount":2962,"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-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/","url":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/","name":"Vue.js Uygulamalar\u0131nda Durum Y\u00f6netimi: Vuex ile Kapsaml\u0131 Bir Yakla\u015f\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-17T01:41:04+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-durum-yonetimi-vuex-ile-kapsamli-bir-yaklasim\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Vue.js Uygulamalar\u0131nda Durum Y\u00f6netimi: Vuex ile Kapsaml\u0131 Bir Yakla\u015f\u0131m"}]},{"@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\/32050","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=32050"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32050\/revisions"}],"predecessor-version":[{"id":32051,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32050\/revisions\/32051"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32050"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32050"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32050"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}