{"id":36420,"date":"2025-12-16T07:40:40","date_gmt":"2025-12-16T04:40:40","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=36420"},"modified":"2025-12-16T07:40:40","modified_gmt":"2025-12-16T04:40:40","slug":"root-reducer-kullanarak-redux-statei-nasil-sifirlanir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/","title":{"rendered":"Root Reducer Kullanarak Redux State&#8217;i Nas\u0131l S\u0131f\u0131rlan\u0131r?"},"content":{"rendered":"<p><body><\/p>\n<h2>Root Reducer Kullanarak Redux State&#8217;i Nas\u0131l S\u0131f\u0131rlan\u0131r?<\/h2>\n<p>Modern web uygulamalar\u0131, kullan\u0131c\u0131 deneyimini zenginle\u015ftiren dinamik aray\u00fczler ve karma\u015f\u0131k etkile\u015fimlerle doludur. Bu t\u00fcr uygulamalarda, uygulaman\u0131n durumunu (state) y\u00f6netmek, geli\u015ftirme s\u00fcrecinin en kritik ve \u00e7o\u011fu zaman en zorlu y\u00f6nlerinden biridir. \u00d6zellikle tek sayfa uygulamalar\u0131 (SPA&#8217;lar) ba\u011flam\u0131nda, uygulaman\u0131n farkl\u0131 bile\u015fenleri aras\u0131nda tutarl\u0131 bir durum ak\u0131\u015f\u0131 sa\u011flamak, \u00f6l\u00e7eklenebilir ve bak\u0131m\u0131 kolay bir kod taban\u0131 olu\u015fturmak i\u00e7in hayati \u00f6neme sahiptir. \u0130\u015fte bu noktada Redux gibi durum y\u00f6netim k\u00fct\u00fcphaneleri devreye girer.<\/p>\n<p>Redux, JavaScript uygulamalar\u0131 i\u00e7in tahmin edilebilir bir durum konteyneridir. Temel prensipleri olan tek bir do\u011fruluk kayna\u011f\u0131 (single source of truth), durumun okunabilir olmas\u0131 ve durumun yaln\u0131zca saf fonksiyonlar (reducers) arac\u0131l\u0131\u011f\u0131yla de\u011fi\u015ftirilebilmesi sayesinde, b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar\u0131n durumunu y\u00f6netmeyi \u00f6nemli \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131r\u0131r. Ancak, uygulaman\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca, bazen t\u00fcm uygulaman\u0131n durumunu veya belirli bir b\u00f6l\u00fcm\u00fcn\u00fc tamamen s\u0131f\u0131rlama ihtiyac\u0131 do\u011far. Bu makalede, bir Redux uygulamas\u0131n\u0131n t\u00fcm durumunu (state) bir &#8220;root reducer&#8221; kullanarak nas\u0131l etkin ve zarif bir \u015fekilde s\u0131f\u0131rlayaca\u011f\u0131m\u0131z\u0131 detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>Redux Durum Y\u00f6netimine Giri\u015f ve S\u0131f\u0131rlama \u0130htiyac\u0131<\/h3>\n<p>Redux, uygulaman\u0131z\u0131n global durumunu merkezi bir yerde, yani &#8220;store&#8221; i\u00e7inde tutar. Bu durum, &#8220;action&#8221; ad\u0131 verilen basit JavaScript nesneleri arac\u0131l\u0131\u011f\u0131yla tetiklenen &#8220;reducer&#8221; ad\u0131 verilen saf fonksiyonlar taraf\u0131ndan de\u011fi\u015ftirilir. Bu yap\u0131, durum de\u011fi\u015fikliklerini \u00f6ng\u00f6r\u00fclebilir ve izlenebilir hale getirir.<\/p>\n<p>Peki, Redux state&#8217;ini s\u0131f\u0131rlama ihtiyac\u0131 neden ortaya \u00e7\u0131kar? Birka\u00e7 yayg\u0131n senaryo \u015funlard\u0131r:<\/p>\n<p>*   <strong>Kullan\u0131c\u0131 Oturumunu Kapatma (Logout):<\/strong> Bir kullan\u0131c\u0131 uygulamadan \u00e7\u0131k\u0131\u015f yapt\u0131\u011f\u0131nda, o kullan\u0131c\u0131ya ait t\u00fcm verilerin (kullan\u0131c\u0131 profili, sepet i\u00e7eri\u011fi, ki\u015fisel ayarlar vb.) Redux state&#8217;inden temizlenmesi gerekir. Aksi takdirde, bir sonraki kullan\u0131c\u0131 veya ayn\u0131 kullan\u0131c\u0131n\u0131n yeni bir oturumunda yanl\u0131\u015f veya eski verilerle kar\u015f\u0131la\u015f\u0131labilir.<br \/>\n*   <strong>Kullan\u0131c\u0131 De\u011fi\u015fimi:<\/strong> \u00c7ok kullan\u0131c\u0131l\u0131 bir sistemde, bir kullan\u0131c\u0131n\u0131n oturumu kapan\u0131p ba\u015fka bir kullan\u0131c\u0131 giri\u015f yapt\u0131\u011f\u0131nda, \u00f6nceki kullan\u0131c\u0131n\u0131n verilerinin tamamen silinmesi ve yeni kullan\u0131c\u0131n\u0131n verileriyle doldurulmas\u0131 gerekir.<br \/>\n*   <strong>Uygulama \u0130\u00e7i &#8220;S\u0131f\u0131rla&#8221; Fonksiyonlar\u0131:<\/strong> Bazen, bir formun veya belirli bir \u00f6zelli\u011fin durumunu ba\u015flang\u0131\u00e7 ayarlar\u0131na d\u00f6nd\u00fcrmek i\u00e7in bir &#8220;S\u0131f\u0131rla&#8221; d\u00fc\u011fmesi gerekebilir.<br \/>\n*   <strong>Test Ortamlar\u0131:<\/strong> Uygulaman\u0131n farkl\u0131 test senaryolar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in her testten \u00f6nce temiz bir durumla ba\u015flamak \u00f6nemlidir.<br \/>\n*   <strong>Hata Kurtarma:<\/strong> Kritik bir hata durumunda, uygulaman\u0131n bilinen iyi bir duruma d\u00f6nmesi i\u00e7in state&#8217;in s\u0131f\u0131rlanmas\u0131 bir se\u00e7enek olabilir.<\/p>\n<p>Bu senaryolarda, Redux state&#8217;ini etkili bir \u015fekilde s\u0131f\u0131rlamak, hem g\u00fcvenlik hem de kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir.<\/p>\n<h3>Redux Temelleri ve Root Reducer Kavram\u0131<\/h3>\n<p>Redux state&#8217;ini s\u0131f\u0131rlama mekanizmas\u0131n\u0131 anlamak i\u00e7in, Redux&#8217;\u0131n temel yap\u0131 ta\u015flar\u0131n\u0131 ve \u00f6zellikle <code>combineReducers<\/code> fonksiyonunun rol\u00fcn\u00fc hat\u0131rlamak \u00f6nemlidir.<\/p>\n<h4>Redux&#8217;\u0131n Ana Bile\u015fenleri<\/h4>\n<p>*   <strong>Store:<\/strong> Uygulaman\u0131z\u0131n t\u00fcm durumunu bar\u0131nd\u0131ran tek bir JavaScript nesnesidir.<br \/>\n*   <strong>Action:<\/strong> Uygulamada meydana gelen olaylar\u0131 tan\u0131mlayan basit JavaScript nesneleridir. Minimum bir <code>type<\/code> \u00f6zelli\u011fine sahiptirler (\u00f6rn. <code>{ type: 'ADD_TODO', payload: 'Learn Redux' }<\/code>).<br \/>\n*   <strong>Reducer:<\/strong> Mevcut durumu ve bir action&#8217;\u0131 alarak yeni durumu d\u00f6nd\u00fcren saf fonksiyonlard\u0131r. Reducer&#8217;lar asla do\u011frudan durumu de\u011fi\u015ftirmezler; her zaman durumun de\u011fi\u015ftirilmi\u015f bir kopyas\u0131n\u0131 d\u00f6nd\u00fcr\u00fcrler.<br \/>\n*   <strong>Dispatch:<\/strong> Bir action&#8217;\u0131 store&#8217;a g\u00f6nderme y\u00f6ntemidir. Action, store&#8217;a ula\u015ft\u0131\u011f\u0131nda, reducer&#8217;lar taraf\u0131ndan i\u015flenir.<\/p>\n<h4>CombineReducers ve Root Reducer<\/h4>\n<p>B\u00fcy\u00fck uygulamalarda, t\u00fcm durumu tek bir reducer i\u00e7inde y\u00f6netmek pratik de\u011fildir. Redux, durumu mant\u0131ksal dilimlere (slice) ay\u0131rmam\u0131z\u0131 ve her dilim i\u00e7in ayr\u0131 bir reducer yazmam\u0131z\u0131 te\u015fvik eder. \u00d6rne\u011fin, bir <code>userReducer<\/code>, bir <code>productReducer<\/code>, bir <code>cartReducer<\/code> vb. olabilir.<\/p>\n<p><code>combineReducers<\/code> fonksiyonu, bu ba\u011f\u0131ms\u0131z reducer&#8217;lar\u0131 tek bir &#8220;root reducer&#8221; alt\u0131nda birle\u015ftirmek i\u00e7in kullan\u0131l\u0131r. <code>combineReducers<\/code>&#8216;a bir nesne ge\u00e7irirsiniz; bu nesnenin anahtarlar\u0131 state&#8217;inizin bir b\u00f6l\u00fcm\u00fcne kar\u015f\u0131l\u0131k gelir ve de\u011ferleri ilgili reducer fonksiyonlar\u0131d\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\/\/ userReducer.js\nconst initialUserState = {\n    isAuthenticated: false,\n    profile: null,\n    loading: false,\n    error: null\n};\n\nconst userReducer = (state = initialUserState, action) => {\n    switch (action.type) {\n        case 'LOGIN_SUCCESS':\n            return { ...state, isAuthenticated: true, profile: action.payload, error: null };\n        case 'LOGOUT':\n            return { ...initialUserState }; \/\/ Bu sadece kendi dilimini s\u0131f\u0131rlar\n        default:\n            return state;\n    }\n};\n\nexport default userReducer;\n\n\/\/ productReducer.js\nconst initialProductState = {\n    products: [],\n    selectedProduct: null,\n    loading: false\n};\n\nconst productReducer = (state = initialProductState, action) => {\n    switch (action.type) {\n        case 'FETCH_PRODUCTS_SUCCESS':\n            return { ...state, products: action.payload, loading: false };\n        case 'SELECT_PRODUCT':\n            return { ...state, selectedProduct: action.payload };\n        default:\n            return state;\n    }\n};\n\nexport default productReducer;\n\n\/\/ rootReducer.js\nimport { combineReducers } from 'redux';\nimport userReducer from '.\/userReducer';\nimport productReducer from '.\/productReducer';\n\nconst rootReducer = combineReducers({\n    user: userReducer,\n    products: productReducer\n});\n\nexport default rootReducer;<\/code><\/pre>\n<p>Bu yap\u0131, state&#8217;in <code>user<\/code> ve <code>products<\/code> gibi anahtarlarla eri\u015filebilen b\u00f6l\u00fcmlere ayr\u0131lmas\u0131n\u0131 sa\u011flar. <code>rootReducer<\/code> ise t\u00fcm bu b\u00f6l\u00fcmleri y\u00f6neten ana fonksiyondur.<\/p>\n<h3>Redux State&#8217;ini S\u0131f\u0131rlamak \u0130\u00e7in \u0130lk Yakla\u015f\u0131mlar (ve Neden Yetersiz Kalabilirler)<\/h3>\n<p>Redux state&#8217;ini s\u0131f\u0131rlama ihtiyac\u0131 do\u011fdu\u011funda, akla gelebilecek ilk birka\u00e7 y\u00f6ntem olabilir. Ancak bu y\u00f6ntemler genellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda yetersiz kal\u0131r veya bak\u0131m\u0131 zorla\u015ft\u0131r\u0131r.<\/p>\n<h4>1. Her Reducer \u0130\u00e7in Ayr\u0131 Bir S\u0131f\u0131rlama Action&#8217;\u0131 ve Logic&#8217;i<\/h4>\n<p>Bu yakla\u015f\u0131mda, her reducer kendi dilimini s\u0131f\u0131rlamak i\u00e7in \u00f6zel bir action type (\u00f6rn. <code>RESET_USER_STATE<\/code>, <code>RESET_PRODUCT_STATE<\/code>) dinler ve kendi <code>initialState<\/code>&#8216;ini d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code class=\"language-javascript\">\/\/ userReducer.js\nconst userReducer = (state = initialUserState, action) => {\n    switch (action.type) {\n        \/\/ ... di\u011fer action'lar\n        case 'RESET_USER_STATE':\n            return { ...initialUserState };\n        default:\n            return state;\n    }\n};\n\n\/\/ productReducer.js\nconst productReducer = (state = initialProductState, action) => {\n    switch (action.type) {\n        \/\/ ... di\u011fer action'lar\n        case 'RESET_PRODUCT_STATE':\n            return { ...initialProductState };\n        default:\n            return state;\n    }\n};<\/code><\/pre>\n<p><strong>Dezavantajlar\u0131:<\/strong><\/p>\n<p>*   <strong>Tekrar:<\/strong> Her yeni reducer ekledi\u011finizde, ona \u00f6zel bir s\u0131f\u0131rlama action&#8217;\u0131 ve logic&#8217;i eklemeniz gerekir. Bu, kod tekrar\u0131na yol a\u00e7ar.<br \/>\n*   <strong>Koordinasyon:<\/strong> T\u00fcm state&#8217;i s\u0131f\u0131rlamak istedi\u011finizde, t\u00fcm bu action&#8217;lar\u0131 tek tek dispatch etmeniz gerekir. Bu, bir <code>logout<\/code> fonksiyonunda birden fazla <code>dispatch<\/code> \u00e7a\u011fr\u0131s\u0131 anlam\u0131na gelir ve bir action&#8217;\u0131 unutmak kolayd\u0131r.<br \/>\n*   <strong>Hata Potansiyeli:<\/strong> Yeni bir reducer eklemeyi unutup ona s\u0131f\u0131rlama logic&#8217;i eklemezseniz, o b\u00f6l\u00fcm s\u0131f\u0131rlanmayacakt\u0131r.<\/p>\n<h4>2. Root Reducer&#8217;da Her Dilimin Initial State&#8217;ini Manuel Olarak D\u00f6nd\u00fcrme<\/h4>\n<p>Bu yakla\u015f\u0131mda, root reducer&#8217;da \u00f6zel bir s\u0131f\u0131rlama action&#8217;\u0131 dinlenir ve bu action geldi\u011finde, her dilimin <code>initialState<\/code>&#8216;i manuel olarak bir nesne i\u00e7inde birle\u015ftirilerek d\u00f6nd\u00fcr\u00fcl\u00fcr.<\/p>\n<pre><code class=\"language-javascript\">\/\/ rootReducer.js\nimport { combineReducers } from 'redux';\nimport userReducer, { initialUserState } from '.\/userReducer'; \/\/ initialState'i import et\nimport productReducer, { initialProductState } from '.\/productReducer'; \/\/ initialState'i import et\n\nconst appReducer = combineReducers({\n    user: userReducer,\n    products: productReducer\n});\n\nconst rootReducer = (state, action) => {\n    if (action.type === 'RESET_APP_STATE') {\n        \/\/ Her reducer'\u0131n initial state'ini manuel olarak birle\u015ftirme\n        return {\n            user: initialUserState,\n            products: initialProductState\n        };\n    }\n    return appReducer(state, action);\n};\n\nexport default rootReducer;<\/code><\/pre>\n<p><strong>Dezavantajlar\u0131:<\/strong><\/p>\n<p>*   <strong>Ba\u011f\u0131ml\u0131l\u0131k:<\/strong> <code>rootReducer<\/code>, her bir alt reducer&#8217;\u0131n <code>initialState<\/code>&#8216;ine do\u011frudan ba\u011f\u0131ml\u0131 hale gelir. Bu, alt reducer&#8217;lar\u0131n <code>initialState<\/code>&#8216;ini de\u011fi\u015ftirdi\u011finizde <code>rootReducer<\/code>&#8216;\u0131 da g\u00fcncellemeniz gerekti\u011fi anlam\u0131na gelir.<br \/>\n*   <strong>Bak\u0131m Zorlu\u011fu:<\/strong> Yeni bir reducer ekledi\u011finizde veya mevcut bir reducer&#8217;\u0131 kald\u0131rd\u0131\u011f\u0131n\u0131zda, <code>rootReducer<\/code>&#8216;\u0131 manuel olarak g\u00fcncellemeniz gerekir. Bu, b\u00fcy\u00fck uygulamalarda s\u00fcrd\u00fcr\u00fclemez hale gelir.<br \/>\n*   <strong>Tekrar:<\/strong> Yine kod tekrar\u0131 mevcuttur ve hata yapma olas\u0131l\u0131\u011f\u0131 y\u00fcksektir.<\/p>\n<p>Bu yakla\u015f\u0131mlar\u0131n her ikisi de, Redux&#8217;\u0131n &#8220;tek bir do\u011fruluk kayna\u011f\u0131&#8221; ve &#8220;mod\u00fclerlik&#8221; felsefesine tam olarak uymayan, merkezi olmayan veya bak\u0131m\u0131 zor \u00e7\u00f6z\u00fcmler sunar. Daha zarif ve \u00f6l\u00e7eklenebilir bir \u00e7\u00f6z\u00fcm, <code>combineReducers<\/code>&#8216;\u0131n kendisini kullanarak root reducer seviyesinde bir s\u0131f\u0131rlama mekanizmas\u0131 olu\u015fturmakt\u0131r.<\/p>\n<h3>Root Reducer Kullanarak Redux State&#8217;ini S\u0131f\u0131rlama: Zarif \u00c7\u00f6z\u00fcm<\/h3>\n<p>Redux state&#8217;ini s\u0131f\u0131rlaman\u0131n en temiz ve en Redux-vari yolu, <code>combineReducers<\/code> taraf\u0131ndan olu\u015fturulan ana reducer fonksiyonunu sarmalayarak, \u00f6zel bir &#8220;s\u0131f\u0131rlama&#8221; action&#8217;\u0131n\u0131 yakalamak ve bu action&#8217;a yan\u0131t olarak t\u00fcm state&#8217;i ba\u015flang\u0131\u00e7 durumuna d\u00f6nd\u00fcrmektir. Bu y\u00f6ntem, t\u00fcm Redux mimarisinin g\u00fcc\u00fcnden faydalan\u0131r ve minimum kod tekrar\u0131 ile maksimum esneklik sa\u011flar.<\/p>\n<h4>Temel Fikir<\/h4>\n<p><code>combineReducers<\/code> fonksiyonu, kendisine ge\u00e7irilen reducer&#8217;lar\u0131 birle\u015ftirerek tek bir reducer fonksiyonu d\u00f6nd\u00fcr\u00fcr. Bu d\u00f6nd\u00fcr\u00fclen fonksiyon, <code>(state, action)<\/code> imzas\u0131n\u0131 bekler ve \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda her bir alt reducer&#8217;\u0131 uygun state dilimi ve action ile \u00e7a\u011f\u0131r\u0131r, sonu\u00e7lar\u0131 birle\u015ftirir ve yeni bir state nesnesi d\u00f6nd\u00fcr\u00fcr.<\/p>\n<p>Ana fikir \u015fudur: E\u011fer \u00f6zel bir <code>RESET_STATE<\/code> action&#8217;\u0131 al\u0131rsak, <code>combineReducers<\/code> taraf\u0131ndan olu\u015fturulan <code>appReducer<\/code> fonksiyonunu <code>undefined<\/code> state ile \u00e7a\u011f\u0131raca\u011f\u0131z. Redux&#8217;ta bir reducer, <code>undefined<\/code> state ile \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, kendi <code>initialState<\/code>&#8216;ini d\u00f6nd\u00fcrmekle y\u00fck\u00fcml\u00fcd\u00fcr. Bu prensip, t\u00fcm alt reducer&#8217;lar\u0131n kendi ba\u015flang\u0131\u00e7 durumlar\u0131na d\u00f6nmesini otomatik olarak sa\u011flar.<\/p>\n<h4>Ad\u0131m Ad\u0131m Uygulama<\/h4>\n<p>\u015eimdi bu zarif \u00e7\u00f6z\u00fcm\u00fc ad\u0131m ad\u0131m uygulayal\u0131m.<\/p>\n<h5>Ad\u0131m 1: S\u0131f\u0131rlama Action Type&#8217;\u0131n\u0131 Tan\u0131mlay\u0131n<\/h5>\n<p>\u00d6ncelikle, t\u00fcm uygulamay\u0131 s\u0131f\u0131rlayacak benzersiz bir action type tan\u0131mlamam\u0131z gerekir.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/redux\/actionTypes.js\nexport const RESET_APP_STATE = 'RESET_APP_STATE';\n\n\/\/ Di\u011fer action tipleri...\nexport const LOGIN_SUCCESS = 'LOGIN_SUCCESS';\nexport const LOGOUT = 'LOGOUT';\nexport const FETCH_PRODUCTS_SUCCESS = 'FETCH_PRODUCTS_SUCCESS';<\/code><\/pre>\n<h5>Ad\u0131m 2: S\u0131f\u0131rlama Action Creator&#8217;\u0131n\u0131 Olu\u015fturun<\/h5>\n<p>Bu action type&#8217;\u0131 dispatch etmek i\u00e7in basit bir action creator olu\u015ftural\u0131m.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/redux\/actions.js\nimport { RESET_APP_STATE, LOGIN_SUCCESS, LOGOUT, FETCH_PRODUCTS_SUCCESS } from '.\/actionTypes';\n\nexport const resetAppState = () => ({\n    type: RESET_APP_STATE\n});\n\nexport const loginSuccess = (profile) => ({\n    type: LOGIN_SUCCESS,\n    payload: profile\n});\n\nexport const logout = () => ({\n    type: LOGOUT\n});\n\nexport const fetchProductsSuccess = (products) => ({\n    type: FETCH_PRODUCTS_SUCCESS,\n    payload: products\n});<\/code><\/pre>\n<h5>Ad\u0131m 3: Slice Reducer&#8217;lar\u0131n\u0131z\u0131 Olu\u015fturun (Ba\u015flang\u0131\u00e7 Durumlar\u0131yla)<\/h5>\n<p>Her reducer&#8217;\u0131n kendi ba\u015flang\u0131\u00e7 durumunu (initial state) net bir \u015fekilde tan\u0131mlamas\u0131 \u00e7ok \u00f6nemlidir. Bu, <code>undefined<\/code> state ile \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda do\u011fru \u015fekilde s\u0131f\u0131rlanmalar\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/redux\/reducers\/userReducer.js\nimport { LOGIN_SUCCESS, LOGOUT } from '..\/actionTypes';\n\nconst initialUserState = {\n    isAuthenticated: false,\n    profile: null,\n    loading: false,\n    error: null\n};\n\nconst userReducer = (state = initialUserState, action) => {\n    switch (action.type) {\n        case LOGIN_SUCCESS:\n            return { ...state, isAuthenticated: true, profile: action.payload, error: null };\n        case LOGOUT:\n            \/\/ Bu action sadece kendi dilimini s\u0131f\u0131rlayabilir, ancak global s\u0131f\u0131rlama i\u00e7in buna gerek yok.\n            \/\/ Yine de tutarl\u0131l\u0131k i\u00e7in b\u0131rak\u0131labilir.\n            return { ...initialUserState };\n        default:\n            return state;\n    }\n};\n\nexport default userReducer;\n\n\/\/ src\/redux\/reducers\/productReducer.js\nimport { FETCH_PRODUCTS_SUCCESS } from '..\/actionTypes';\n\nconst initialProductState = {\n    products: [],\n    selectedProduct: null,\n    loading: false\n};\n\nconst productReducer = (state = initialProductState, action) => {\n    switch (action.type) {\n        case FETCH_PRODUCTS_SUCCESS:\n            return { ...state, products: action.payload, loading: false };\n        \/\/ ... di\u011fer product action'lar\u0131\n        default:\n            return state;\n    }\n};\n\nexport default productReducer;\n\n\/\/ src\/redux\/reducers\/cartReducer.js\nconst initialCartState = {\n    items: [],\n    totalQuantity: 0,\n    totalPrice: 0\n};\n\nconst cartReducer = (state = initialCartState, action) => {\n    switch (action.type) {\n        case 'ADD_TO_CART':\n            \/\/ ... sepete ekleme mant\u0131\u011f\u0131\n            return { ...state, items: [...state.items, action.payload] };\n        case 'REMOVE_FROM_CART':\n            \/\/ ... sepetten \u00e7\u0131karma mant\u0131\u011f\u0131\n            return { ...state, items: state.items.filter(item => item.id !== action.payload) };\n        default:\n            return state;\n    }\n};\n\nexport default cartReducer;<\/code><\/pre>\n<h5>Ad\u0131m 4: Root Reducer&#8217;\u0131 Modify Edin<\/h5>\n<p>Bu, \u00e7\u00f6z\u00fcm\u00fcn kalbidir. <code>combineReducers<\/code> taraf\u0131ndan olu\u015fturulan ana reducer&#8217;\u0131 sarmalayaca\u011f\u0131z.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/redux\/reducers\/index.js\nimport { combineReducers } from 'redux';\nimport { RESET_APP_STATE } from '..\/actionTypes';\nimport userReducer from '.\/userReducer';\nimport productReducer from '.\/productReducer';\nimport cartReducer from '.\/cartReducer'; \/\/ Yeni eklenen reducer\n\n\/\/ T\u00fcm alt reducer'lar\u0131 birle\u015ftiren ana reducer'\u0131 olu\u015fturun\nconst appReducer = combineReducers({\n    user: userReducer,\n    products: productReducer,\n    cart: cartReducer \/\/ Yeni reducer'\u0131 ekle\n});\n\n\/\/ Root reducer'\u0131 tan\u0131mlay\u0131n\nconst rootReducer = (state, action) => {\n    \/\/ E\u011fer RESET_APP_STATE action'\u0131 gelirse\n    if (action.type === RESET_APP_STATE) {\n        \/\/ appReducer'\u0131 undefined state ile \u00e7a\u011f\u0131rarak t\u00fcm alt reducer'lar\u0131n\n        \/\/ kendi ba\u015flang\u0131\u00e7 durumlar\u0131na d\u00f6nmesini sa\u011flay\u0131n.\n        \/\/ Action'\u0131 da ge\u00e7irmek \u00f6nemlidir, baz\u0131 reducer'lar action'a ba\u011fl\u0131 olarak\n        \/\/ ba\u015flang\u0131\u00e7 durumu d\u00f6nd\u00fcrebilir (nadiren de olsa).\n        return appReducer(undefined, action);\n    }\n\n    \/\/ Di\u011fer t\u00fcm action'lar i\u00e7in normal appReducer'\u0131 \u00e7a\u011f\u0131r\u0131n\n    return appReducer(state, action);\n};\n\nexport default rootReducer;<\/code><\/pre>\n<p>Bu yap\u0131, <code>RESET_APP_STATE<\/code> action&#8217;\u0131 dispatch edildi\u011finde, <code>appReducer<\/code>&#8216;\u0131n <code>state<\/code> parametresine <code>undefined<\/code> ge\u00e7irilmesini sa\u011flar. Bu, <code>combineReducers<\/code>&#8216;\u0131n her bir alt reducer&#8217;\u0131 <code>undefined<\/code> state ile \u00e7a\u011f\u0131rmas\u0131na neden olur ve her alt reducer, kendi tan\u0131mlad\u0131\u011f\u0131 <code>initialState<\/code>&#8216;i d\u00f6nd\u00fcr\u00fcr. Sonu\u00e7 olarak, t\u00fcm Redux store, ilk y\u00fckleme an\u0131ndaki durumuna geri d\u00f6ner.<\/p>\n<h5>Ad\u0131m 5: Store&#8217;u Olu\u015fturun<\/h5>\n<p>Standart Redux store kurulumunu yap\u0131n.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/redux\/store.js\nimport { createStore, applyMiddleware } from 'redux';\nimport { composeWithDevTools } from 'redux-devtools-extension'; \/\/ Redux DevTools i\u00e7in\nimport thunk from 'redux-thunk'; \/\/ Asenkron action'lar i\u00e7in\nimport rootReducer from '.\/reducers';\n\nconst middleware = [thunk];\n\nconst store = createStore(\n    rootReducer,\n    composeWithDevTools(applyMiddleware(...middleware))\n);\n\nexport default store;<\/code><\/pre>\n<h5>Ad\u0131m 6: S\u0131f\u0131rlama Action&#8217;\u0131n\u0131 Dispatch Edin<\/h5>\n<p>\u015eimdi, uygulaman\u0131zda state&#8217;i s\u0131f\u0131rlamak istedi\u011finiz herhangi bir yerden <code>resetAppState<\/code> action&#8217;\u0131n\u0131 dispatch edebilirsiniz. En yayg\u0131n senaryo, kullan\u0131c\u0131 \u00e7\u0131k\u0131\u015f yapt\u0131\u011f\u0131nda (logout) ger\u00e7ekle\u015fir.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/components\/LogoutButton.js\nimport React from 'react';\nimport { useDispatch } from 'react-redux';\nimport { resetAppState, logout } from '..\/redux\/actions'; \/\/ logout action'\u0131 da ekledik\n\nconst LogoutButton = () => {\n    const dispatch = useDispatch();\n\n    const handleLogout = () => {\n        \/\/ Redux state'ini s\u0131f\u0131rla\n        dispatch(resetAppState());\n\n        \/\/ Kullan\u0131c\u0131 oturumunu kapatma ile ilgili di\u011fer i\u015flemleri yap\n        \/\/ \u00d6rne\u011fin, localStorage'dan token'\u0131 sil, API'ye logout iste\u011fi g\u00f6nder vb.\n        \/\/ dispatch(logout()); \/\/ E\u011fer logout'un kendi reducer logic'i varsa \u00e7a\u011f\u0131r.\n        \/\/ Bu \u00f6rnekte resetAppState() zaten her \u015feyi s\u0131f\u0131rlayaca\u011f\u0131 i\u00e7in logout action'\u0131na gerek kalmaz.\n        \/\/ Ancak API taraf\u0131nda bir logout i\u015flemi varsa bu action yine de g\u00f6nderilebilir.\n        localStorage.removeItem('authToken');\n        console.log('Kullan\u0131c\u0131 \u00e7\u0131k\u0131\u015f yapt\u0131 ve Redux state s\u0131f\u0131rland\u0131.');\n        \/\/ Y\u00f6nlendirme vb.\n    };\n\n    return (\n        <button onClick={handleLogout}>\u00c7\u0131k\u0131\u015f Yap<\/button>\n    );\n};\n\nexport default LogoutButton;<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>handleLogout<\/code> fonksiyonu \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda <code>resetAppState()<\/code> action&#8217;\u0131 dispatch edilir. Bu, <code>rootReducer<\/code> taraf\u0131ndan yakalan\u0131r ve t\u00fcm uygulaman\u0131n durumu ba\u015flang\u0131\u00e7 de\u011ferlerine s\u0131f\u0131rlan\u0131r.<\/p>\n<h3>Bu Yakla\u015f\u0131m\u0131n Avantajlar\u0131<\/h3>\n<p>Root reducer arac\u0131l\u0131\u011f\u0131yla state s\u0131f\u0131rlama, bir dizi \u00f6nemli avantaj sunar:<\/p>\n<p>*   <strong>Merkezi Kontrol:<\/strong> T\u00fcm uygulaman\u0131n durumunu tek bir noktadan s\u0131f\u0131rlama yetene\u011fi sa\u011flar. Bu, kodun daha d\u00fczenli ve anla\u015f\u0131l\u0131r olmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>Kod Tekrar\u0131n\u0131 \u00d6nler:<\/strong> Her bir reducer i\u00e7in ayr\u0131 s\u0131f\u0131rlama logic&#8217;i yazmaktan veya her reducer&#8217;\u0131n <code>initialState<\/code>&#8216;ini manuel olarak y\u00f6netmekten kurtulursunuz. Yeni bir reducer eklendi\u011finde, s\u0131f\u0131rlama logic&#8217;ini g\u00fcncellemenize gerek kalmaz; sadece <code>combineReducers<\/code>&#8216;a eklemeniz yeterlidir.<br \/>\n*   <strong>Mod\u00fclerlik ve \u00d6l\u00e7eklenebilirlik:<\/strong> Her reducer kendi <code>initialState<\/code>&#8216;ini tan\u0131mlar ve yaln\u0131zca kendi diliminden sorumludur. <code>rootReducer<\/code> ise bu mod\u00fcler yap\u0131y\u0131 bozmadan global bir s\u0131f\u0131rlama mekanizmas\u0131 sunar. Uygulama b\u00fcy\u00fcd\u00fck\u00e7e bu yakla\u015f\u0131m kolayca \u00f6l\u00e7eklenir.<br \/>\n*   <strong>Tutarl\u0131l\u0131k:<\/strong> T\u00fcm state&#8217;in e\u015f zamanl\u0131 ve do\u011fru bir \u015fekilde s\u0131f\u0131rlanmas\u0131n\u0131 garanti eder. Hi\u00e7bir state diliminin g\u00f6zden ka\u00e7\u0131r\u0131lmamas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>Bak\u0131m Kolayl\u0131\u011f\u0131:<\/strong> Yeni geli\u015ftiricilerin projeye adapte olmas\u0131 daha kolayd\u0131r \u00e7\u00fcnk\u00fc state s\u0131f\u0131rlama mekanizmas\u0131 a\u00e7\u0131k ve standartt\u0131r.<\/p>\n<h3>Dikkat Edilmesi Gerekenler ve En \u0130yi Uygulamalar<\/h3>\n<p>Bu g\u00fc\u00e7l\u00fc s\u0131f\u0131rlama mekanizmas\u0131n\u0131 kullan\u0131rken baz\u0131 noktalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir:<\/p>\n<p>*   <strong><code>initialState<\/code> Tan\u0131mlar\u0131:<\/strong> Her reducer&#8217;\u0131n kendi <code>initialState<\/code>&#8216;ini do\u011fru ve eksiksiz bir \u015fekilde tan\u0131mlad\u0131\u011f\u0131ndan emin olun. <code>undefined<\/code> state ile \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda reducer&#8217;\u0131n bu ba\u015flang\u0131\u00e7 durumunu d\u00f6nd\u00fcrmesi kritik \u00f6neme sahiptir.<br \/>\n*   <strong>Yan Etkiler (Side Effects):<\/strong> Redux state&#8217;ini s\u0131f\u0131rlamak, Redux store&#8217;u temizler, ancak taray\u0131c\u0131n\u0131n <code>localStorage<\/code>, <code>sessionStorage<\/code> gibi depolama alanlar\u0131ndaki verileri veya API \u00e7a\u011fr\u0131lar\u0131 gibi devam eden asenkron i\u015flemleri etkilemez. Kullan\u0131c\u0131 \u00e7\u0131k\u0131\u015f\u0131 gibi durumlarda, bu yan etkileri de manuel olarak temizlemeniz veya iptal etmeniz gerekebilir (\u00f6rn. <code>localStorage.removeItem('authToken')<\/code>, devam eden API isteklerini iptal etme).<br \/>\n*   <strong>Persist Durumu:<\/strong> E\u011fer <code>redux-persist<\/code> gibi bir k\u00fct\u00fcphane kullan\u0131yorsan\u0131z, <code>RESET_APP_STATE<\/code> action&#8217;\u0131 dispatch edildi\u011finde, persist edilen state&#8217;in de do\u011fru \u015fekilde temizlendi\u011finden emin olman\u0131z gerekir. <code>redux-persist<\/code> genellikle bir <code>PURGE<\/code> action&#8217;\u0131 veya \u00f6zel bir transform ile bu durumu y\u00f6netmek i\u00e7in yollar sunar. Genellikle, <code>RESET_APP_STATE<\/code> action&#8217;\u0131 dispatch edildikten sonra <code>redux-persist<\/code>&#8216;in <code>PURGE<\/code> action&#8217;\u0131n\u0131 da dispatch etmek en iyi uygulama olabilir.<br \/>\n*   <strong>Performans:<\/strong> \u00c7ok b\u00fcy\u00fck bir state&#8217;i s\u0131f\u0131rlamak teorik olarak k\u00fc\u00e7\u00fck bir performans maliyeti getirebilir, ancak modern donan\u0131m ve JavaScript motorlar\u0131 g\u00f6z \u00f6n\u00fcne al\u0131nd\u0131\u011f\u0131nda, \u00e7o\u011fu uygulama i\u00e7in bu ihmal edilebilir d\u00fczeydedir.<br \/>\n*   <strong>Test Edilebilirlik:<\/strong> Bu s\u0131f\u0131rlama mekanizmas\u0131n\u0131 birim ve entegrasyon testlerinizde kolayca test edebilirsiniz. Bir test senaryosundan sonra <code>resetAppState()<\/code> action&#8217;\u0131n\u0131 dispatch ederek uygulaman\u0131n temiz bir duruma d\u00f6nd\u00fc\u011f\u00fcn\u00fc do\u011frulayabilirsiniz.<\/p>\n<pre><code class=\"language-javascript\">\/\/ \u00d6rnek test senaryosu (jest\/testing-library ile)\nimport { render, screen, fireEvent } from '@testing-library\/react';\nimport { Provider } from 'react-redux';\nimport { createStore } from 'redux';\nimport rootReducer from '..\/redux\/reducers';\nimport LogoutButton from '..\/components\/LogoutButton';\nimport App from '..\/App'; \/\/ Uygulaman\u0131z\u0131n ana bile\u015feni\n\ndescribe('Logout functionality', () => {\n    let store;\n\n    beforeEach(() => {\n        store = createStore(rootReducer);\n        \/\/ Testten \u00f6nce initial state'i doldur\n        store.dispatch({ type: 'LOGIN_SUCCESS', payload: { name: 'Test User' } });\n        store.dispatch({ type: 'ADD_TO_CART', payload: { id: 1, name: 'Product A' } });\n        \/\/ localStorage'\u0131 da mock'layabilirsiniz\n        Object.defineProperty(window, 'localStorage', {\n            value: {\n                removeItem: jest.fn(),\n                setItem: jest.fn(),\n                getItem: jest.fn(),\n                clear: jest.fn(),\n            },\n            writable: true,\n        });\n    });\n\n    test('resets Redux state and clears local storage on logout', () => {\n        render(\n            <Provider store={store}>\n                <App \/> {\/<em> App bile\u015feninizde LogoutButton oldu\u011funu varsayal\u0131m <\/em>\/}\n                <LogoutButton \/>\n            <\/Provider>\n        );\n\n        \/\/ State'in dolu oldu\u011funu do\u011frula\n        expect(store.getState().user.isAuthenticated).toBe(true);\n        expect(store.getState().cart.items.length).toBe(1);\n\n        \/\/ \u00c7\u0131k\u0131\u015f yap d\u00fc\u011fmesine t\u0131kla\n        fireEvent.click(screen.getByText(\/\u00c7\u0131k\u0131\u015f Yap\/i));\n\n        \/\/ Redux state'inin s\u0131f\u0131rland\u0131\u011f\u0131n\u0131 do\u011frula\n        expect(store.getState().user.isAuthenticated).toBe(false);\n        expect(store.getState().user.profile).toBe(null);\n        expect(store.getState().cart.items.length).toBe(0);\n\n        \/\/ localStorage'\u0131n temizlendi\u011fini do\u011frula\n        expect(window.localStorage.removeItem).toHaveBeenCalledWith('authToken');\n    });\n});<\/code><\/pre>\n<h3>Sonu\u00e7<\/h3>\n<p>Redux, modern web uygulamalar\u0131nda durum y\u00f6netimini basitle\u015ftiren g\u00fc\u00e7l\u00fc bir k\u00fct\u00fcphanedir. Ancak, uygulaman\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca, t\u00fcm Redux state&#8217;ini temiz ve etkili bir \u015fekilde s\u0131f\u0131rlamak i\u00e7in iyi d\u00fc\u015f\u00fcn\u00fclm\u00fc\u015f bir mekanizma gereklidir. Bu makalede ele ald\u0131\u011f\u0131m\u0131z root reducer&#8217;\u0131 sarmalama yakla\u015f\u0131m\u0131, bu ihtiyac\u0131 kar\u015f\u0131laman\u0131n en zarif, \u00f6l\u00e7eklenebilir ve Redux felsefesine uygun yoludur.<\/p>\n<p><code>combineReducers<\/code> taraf\u0131ndan olu\u015fturulan ana reducer&#8217;\u0131 \u00f6zel bir <code>RESET_APP_STATE<\/code> action&#8217;\u0131 ile <code>undefined<\/code> state ile \u00e7a\u011f\u0131rmak, t\u00fcm alt reducer&#8217;lar\u0131n kendi ba\u015flang\u0131\u00e7 durumlar\u0131na d\u00f6nmesini sa\u011flayarak, uygulaman\u0131n durumunu merkezi ve tutarl\u0131 bir \u015fekilde s\u0131f\u0131rlar. Bu y\u00f6ntem, kod tekrar\u0131n\u0131 \u00f6nler, bak\u0131m\u0131 kolayla\u015ft\u0131r\u0131r ve uygulaman\u0131z\u0131n daha g\u00fcvenli ve \u00f6ng\u00f6r\u00fclebilir olmas\u0131n\u0131 sa\u011flar. Do\u011fru <code>initialState<\/code> tan\u0131mlar\u0131 ve yan etkilerin y\u00f6netimi ile birlikte kullan\u0131ld\u0131\u011f\u0131nda, bu yakla\u015f\u0131m Redux uygulamalar\u0131n\u0131zda state s\u0131f\u0131rlama sorununu kal\u0131c\u0131 olarak \u00e7\u00f6zer.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Root Reducer Kullanarak Redux State&#8217;i Nas\u0131l S\u0131f\u0131rlan\u0131r?\nModern web uygulamalar\u0131, kullan\u0131c\u0131 deneyimini zenginle\u015ftiren dinamik aray\u00fczler ve ka","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":[1],"tags":[],"class_list":{"0":"post-36420","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","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>Root Reducer Kullanarak Redux State&#039;i Nas\u0131l S\u0131f\u0131rlan\u0131r? - 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\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Root Reducer Kullanarak Redux State&#039;i Nas\u0131l S\u0131f\u0131rlan\u0131r?\" \/>\n<meta property=\"og:description\" content=\"Root Reducer Kullanarak Redux State&#039;i Nas\u0131l S\u0131f\u0131rlan\u0131r? Modern web uygulamalar\u0131, kullan\u0131c\u0131 deneyimini zenginle\u015ftiren dinamik aray\u00fczler ve ka\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-16T04:40:40+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Root Reducer Kullanarak Redux State&#8217;i Nas\u0131l S\u0131f\u0131rlan\u0131r?\",\"datePublished\":\"2025-12-16T04:40:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/\"},\"wordCount\":2196,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/\",\"name\":\"Root Reducer Kullanarak Redux State'i Nas\u0131l S\u0131f\u0131rlan\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-16T04:40:40+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Root Reducer Kullanarak Redux State&#8217;i Nas\u0131l S\u0131f\u0131rlan\u0131r?\"}]},{\"@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":"Root Reducer Kullanarak Redux State'i Nas\u0131l S\u0131f\u0131rlan\u0131r? - 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\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/","og_locale":"tr_TR","og_type":"article","og_title":"Root Reducer Kullanarak Redux State'i Nas\u0131l S\u0131f\u0131rlan\u0131r?","og_description":"Root Reducer Kullanarak Redux State'i Nas\u0131l S\u0131f\u0131rlan\u0131r? Modern web uygulamalar\u0131, kullan\u0131c\u0131 deneyimini zenginle\u015ftiren dinamik aray\u00fczler ve ka","og_url":"https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-16T04:40:40+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"16 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Root Reducer Kullanarak Redux State&#8217;i Nas\u0131l S\u0131f\u0131rlan\u0131r?","datePublished":"2025-12-16T04:40:40+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/"},"wordCount":2196,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/","url":"https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/","name":"Root Reducer Kullanarak Redux State'i Nas\u0131l S\u0131f\u0131rlan\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-16T04:40:40+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/root-reducer-kullanarak-redux-statei-nasil-sifirlanir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Root Reducer Kullanarak Redux State&#8217;i Nas\u0131l S\u0131f\u0131rlan\u0131r?"}]},{"@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\/36420","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=36420"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36420\/revisions"}],"predecessor-version":[{"id":36421,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36420\/revisions\/36421"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36420"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36420"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36420"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}