React İle Redux Toolkit Kullanarak State Yönetimi Nasıl Yapılır?

React İle Redux Toolkit Kullanarak State Yönetimi Nasıl Yapılır?
React İle Redux Toolkit Kullanarak State Yönetimi Nasıl Yapılır?

Ön Hazırlık ve Gereksinimler

Projeye başlamadan önce bilgisayarınızda Node.js'in güncel bir sürümünün (LTS) yüklü olduğundan emin olun. React projenizi oluşturduktan sonra gerekli bağımlılıkları yükleyerek işe başlayacağız.

Aşağıdaki komutları terminalinizde çalıştırarak projenize Redux Toolkit ve React-Redux kütüphanelerini dahil edebilirsiniz:

npm install @reduxjs/toolkit react-redux

Bu paketler, state yönetimi için gerekli olan configureStore, createSlice ve useSelector/useDispatch kancalarını (hooks) projenize kazandıracaktır.

Redux Store Yapılandırması

Redux Toolkit, store kurulumunu basitleştirmek için configureStore fonksiyonunu kullanır. Store, uygulamanızın tüm state'inin tutulduğu merkezi bir depodur.

// src/app/store.js
import { configureStore } from '@reduxjs/toolkit';
import counterReducer from '../features/counter/counterSlice';

export const store = configureStore({
  reducer: {
    counter: counterReducer,
  },
});

Burada tanımladığımız counter anahtarı, state ağacındaki isimlendirmeyi belirler. reducer özelliği, uygulamanızdaki tüm alt modüllerin birleştirildiği yerdir.

Slice Oluşturma: Mantık ve State

Redux Toolkit'te "Slice", belirli bir özellik seti için gerekli olan reducer ve action'ları tek bir dosyada toplar. createSlice fonksiyonu, geleneksel Redux'taki "action type" ve "reducer" yazma zorunluluğunu ortadan kaldırır.

// src/features/counter/counterSlice.js
import { createSlice } from '@reduxjs/toolkit';

const counterSlice = createSlice({
  name: 'counter',
  initialState: { value: 0 },
  reducers: {
    increment: (state) => {
      state.value += 1;
    },
    decrement: (state) => {
      state.value -= 1;
    },
  },
});

export const { increment, decrement } = counterSlice.actions;
export default counterSlice.reducer;

RTK, arka planda Immer kütüphanesini kullanarak state'i doğrudan değiştiriyormuşsunuz gibi kod yazmanıza olanak tanır; aslında bu işlem güvenli bir şekilde yeni bir state kopyası oluşturur.

Provider ile Uygulamayı Sarmalama

Oluşturduğumuz store'u tüm React ağacına tanıtmak için Provider bileşenini kullanırız. Bu işlem genellikle main.jsx veya index.js dosyasında yapılır.

// src/main.jsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import { Provider } from 'react-redux';
import { store } from './app/store';
import App from './App';

ReactDOM.createRoot(document.getElementById('root')).render(
  
    
  
);

Bu sarmalama işlemi, uygulamanın en altındaki bileşenin bile store'a erişmesini sağlar.

React Bileşenlerinde State Kullanımı

State'i okumak için useSelector, state'i güncellemek (action tetiklemek) için ise useDispatch kancalarını kullanırız. Bu, React ile Redux arasındaki köprüdür.

// src/features/counter/Counter.jsx
import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement } from './counterSlice';

export function Counter() {
  const count = useSelector((state) => state.counter.value);
  const dispatch = useDispatch();

  return (
    

Sayaç: {count}

dispatch(increment())}>Artır dispatch(decrement())}>Azalt
); }

Burada useSelector ile state'in bir kısmını seçiyoruz. useDispatch ile ise tanımladığımız increment veya decrement eylemlerini tetikliyoruz.

Redux Toolkit vs Klasik Redux

Özellik Klasik Redux Redux Toolkit
Kod Miktarı Çok Fazla (Boilerplate) Minimal
Immutability Manuel Yönetim Otomatik (Immer)
Konfigürasyon Karmaşık Basit (configureStore)
Öğrenme Eğrisi Zor Kolay

Güvenlik Uyarısı: Redux store içerisinde hassas kullanıcı verilerini (şifre, token vb.) tutarken dikkatli olun. State, tarayıcı hafızasında tutulduğu için "XSS" saldırılarına karşı savunmasız kalabilir. Hassas verileri mümkünse HTTP-only cookie içerisinde saklayın ve Redux'ı sadece uygulama akışı için kullanın.

Sıkça Sorulan Sorular

Redux Toolkit kullanmak zorunlu mu?

Hayır, küçük projelerde React'in kendi useContext yapısı yeterli olabilir. Ancak orta ve büyük ölçekli uygulamalarda hata ayıklama ve performans için RTK standarttır.

State'i neden doğrudan değiştiremiyoruz?

State'in değişmez (immutable) olması, React'in bileşeni ne zaman yeniden render etmesi gerektiğini anlamasını sağlar. RTK, bu karmaşayı arka planda yönetir.

Birden fazla slice nasıl eklenir?

configureStore içindeki reducer objesine yeni slice'larınızı ekleyerek kolayca genişletebilirsiniz.

Asenkron işlemler (API çağrıları) nasıl yapılır?

RTK içerisinde createAsyncThunk kullanarak API isteklerinizi yönetebilir ve state'i buna göre güncelleyebilirsiniz.

Redux DevTools kullanmalı mıyım?

Kesinlikle. Tarayıcı eklentisi olan Redux DevTools, state değişimlerini zaman çizelgesinde görmenizi ve debug etmenizi sağlar.

Redux Toolkit ile Performans Optimizasyonu

Büyük ölçekli uygulamalarda, Redux state'inin gereksiz yere güncellenmesi veya bileşenlerin ihtiyaç duymadıkları veriler değiştiğinde tekrar render edilmesi performans sorunlarına yol açar. Redux Toolkit ile bu durumu yönetmek için memoization ve seçici (selector) kullanımı kritik öneme sahiptir.

Reselect ve createSelector Kullanımı

useSelector hook'u kullanılırken, state içinden sadece ihtiyacınız olan veriyi çekmek performans için hayati önem taşır. Eğer veriyi çekerken bir hesaplama yapıyorsanız, createSelector kullanarak bu hesaplamanın sadece ilgili veri değiştiğinde çalışmasını sağlayabilirsiniz.

import { createSelector } from '@reduxjs/toolkit';

const selectItems = (state) => state.cart.items;

export const selectTotalAmount = createSelector(
  [selectItems],
  (items) => items.reduce((total, item) => total + item.price, 0)
);

Bu yöntemle, cart.items dizisi değişmediği sürece totalAmount hesaplaması tekrar çalışmaz. Bu, özellikle karmaşık veri yapılarında React bileşenlerinizin gereksiz render edilmesini engeller.

Redux State Yönetiminde Test Stratejileri

Redux Toolkit, mantıksal birimlerin (slice) izole bir şekilde test edilmesini oldukça kolaylaştırır. Redux mantığı saf fonksiyonlardan (pure functions) oluştuğu için, karmaşık bir UI ortamına ihtiyaç duymadan birim testleri (unit tests) yazabilirsiniz.

Slice Reducer Testi

Reducer'larınızı test etmek için, mevcut state'i ve bir action'ı fonksiyona parametre olarak geçip, dönen sonucu beklenen değerle karşılaştırmanız yeterlidir.

import counterReducer from './counterSlice';

test('sayacı bir artırmalıdır', () => {
  const initialState = { value: 0 };
  const action = { type: 'counter/increment' };
  const state = counterReducer(initialState, action);
  
  expect(state.value).toEqual(1);
});

Entegre Testler için Wrapper Kullanımı

Bileşen testlerinde (örneğin Jest ve React Testing Library ile), Redux store'unu her test için yeniden oluşturmanız gerekir. Bunun için özel bir render fonksiyonu oluşturarak tüm testlerinizi bir Provider ile sarmalayabilirsiniz.

import { render } from '@testing-library/react';
import { Provider } from 'react-redux';
import { configureStore } from '@reduxjs/toolkit';
import rootReducer from './reducer';

function renderWithRedux(
  ui,
  { preloadedState = {}, store = configureStore({ reducer: rootReducer, preloadedState }) } = {}
) {
  return {
    ...render({ui}),
    store,
  };
}

Bu yaklaşım, uygulamanızın farklı bölümlerinin Redux ile olan etkileşimini güvenli bir şekilde doğrulamanıza olanak tanır. Testlerinizi yazarken, özellikle asenkron işlemlerin (thunk) sonuçlarını simüle etmek için msw (Mock Service Worker) gibi kütüphanelerden faydalanmanız önerilir.

Sonuç

React ile Redux Toolkit kullanarak state yönetimi yapmak, uygulamanızın veri akışını öngörülebilir ve test edilebilir kılar. Bu rehberde öğrendiğiniz slice yapısı ve hooks kullanımı, modern React geliştirme dünyasının temel taşlarıdır. Bir sonraki adım olarak, createAsyncThunk ile sunucudan veri çekme işlemlerini inceleyerek projenizi bir üst seviyeye taşıyabilirsiniz.

Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamına (production) almadan önce kodlarınızı güvenlik testlerinden geçirin ve bağımlılıklarınızın güncelliğini düzenli olarak kontrol edin.

Bu yazıya tepkinizi paylaşın:
Selin Korkmaz

Kendin yap (DIY) projeleri ve sürdürülebilir yaşam ipuçları üzerine odaklanıyorum. Okuyucularıma bütçe dostu ve yaratıcı çözüm önerileri sunmaktan keyif alıyorum.

Yorumlar (17)

17
okuyucu bu yazı hakkında yorum yaptı. Siz de deneyiminizi paylaşarak diğer okuyuculara yardımcı olabilirsiniz.
Seda Nur
Seda Nur 30 Temmuz 2026

Zamanında Redux çok zahmetliydi diye kaçıyordum, Toolkit olayı gerçekten kolaylaştırmış. Bu yazı sayesinde korkumu yendim diyebilirim.

Caner Yılmaz
Caner Yılmaz 31 Temmuz 2026

Selin hanım elinize sağlık, Context API kullanıyordum ama projeler büyüyünce yönetmek imkansız hale gelmişti. Redux Toolkit ilaç gibi geldi.

Selin Korkmaz
Selin Korkmaz 01 Ağustos 2026

Kesinlikle haklısınız Caner Bey, küçük projelerde Context yeterli olsa da büyük ölçekte Redux Toolkit çok daha sürdürülebilir bir yapı sunuyor.

Kadir G.
Kadir G. 01 Ağustos 2026

Yazı güzel ama görsellerde biraz daha kod bloklarına odaklanabilirdin sanki. Bazı yerlerde mobil ekranda kodlar kaymış.

Berk A.
Berk A. 02 Ağustos 2026

Haklısın, mobilde kodları okumak biraz zor oluyor ama içerik kalitesi çok iyi yine de.

Zeynep Aras
Zeynep Aras 02 Ağustos 2026

Yazı güzelde redux toolkit kurulumu biraz karışık değil mi? Hangi paketleri kurmak gerekiyo tam olarak, kafam karıstı biraz.

Deniz K.
Deniz K. 03 Ağustos 2026

Sadece '@reduxjs/toolkit' ve 'react-redux' kurman yeterli, gerisi eski Redux'a göre çok daha kolay merak etme.

Burak Özdemir
Burak Özdemir 03 Ağustos 2026

Harika bir rehber olmuş, slice mantığını bu kadar açık anlatan pek kaynak yoktu Türkçe olarak. Teşekkürler.

Selin Korkmaz
Selin Korkmaz 04 Ağustos 2026

Güzel yorumunuz için çok teşekkürler Burak, faydalı olmasına sevindim!

Fatih B.
Fatih B. 03 Ağustos 2026

Redux devtools ile state izleme kısmı en sevdiğim yer. Onuda ekleseydin tam olurmuş.

Merve Çelik
Merve Çelik 04 Ağustos 2026

Ya ben kodları denedim ama console da hata alıyorum, neden olabilir acaba? Bi yerde bişeyi eksikmi yaptım?

Selin Korkmaz
Selin Korkmaz 05 Ağustos 2026

Hata mesajını paylaşırsan yardımcı olmaya çalışayım Merve, bazen küçük bir import hatası bile tüm akışı bozabiliyor.

Leyla Y.
Leyla Y. 04 Ağustos 2026

Benim projede state güncellenmiyodu, senin yazıdaki adımları kontrol ettim meğer store tanımlamasını yanlış yapmışım. Çok sağol hayat kurtardın :)

Selin Korkmaz
Selin Korkmaz 05 Ağustos 2026

Sorunu çözmene çok sevindim Leyla, bazen en basit noktalar gözden kaçabiliyor!

Emre Can
Emre Can 05 Ağustos 2026

Eline sağlık Selin, async thunk kısmına da değinseydin efsane olurdu. Belki bir sonraki yazı konusu olabilir?

Selin Korkmaz
Selin Korkmaz 06 Ağustos 2026

Harika öneri Emre! Aslında onu planlıyordum, önümüzdeki hafta detaylı bir API isteği ve async thunk yazısı paylaşacağım.

Oğuzhan
Oğuzhan 06 Ağustos 2026

Hooks kullanımıyla state okumak ne kadar pratikleşmiş ya, eski class componentleri düşününce şimdi cennet gibi.

Yorum Yaz