Merhabalar.

Bu yazımda çoklu slicer kullanımı için sizlere kodları paylaşacağım. Projemize aşağıdaki klasör ve dosyaları ekleyelim.

Amaç

Başlangıçta bir Login sayfası koyacağız. username ve password bilgileri admin admin girilirse giriş başarılı olup Counter uygulaması açılacak. Counter uygulamasına bir Logout butonu koyacağız ve basıldığında geriye login ekranına gönderecek.

App.js

import './App.css';
import { Provider } from 'react-redux';
import store from './ReduxToolkitStore/CounterStore';
import Home from './Components/Home/Home';

function App() {
  

  return (

    <Provider store={store}>

      <div className="App">

        <Home />
        
      </div>

    </Provider>

  );
}

export default App;

Bu kod, bir Redux store’u sağlamak için react-redux‘in Provider bileşenini kullanır. store değişkeni, Redux Toolkit ile oluşturulmuş bir Redux store’unu temsil eder. Home bileşeni ise App bileşeninin içinde render edilir.

Provider bileşeni, içindeki bileşenlere Redux store’u erişimini sağlar. Bu sayede, içerideki bileşenler Redux store’u ile etkileşimde bulunabilir. Bu kod, genellikle bir React uygulamasının en üst düzeyinde bulunan ana bileşeni temsil eder.

Home.jsx

import Counter from '../Counter/Counter';
import Auth from '../Auth/Auth';
import { useSelector } from 'react-redux';

const Home = () => {

    const isAuth = useSelector((state) => state.auth.isAuth);
    
    return (
        
        <div>{isAuth ? <Auth /> : <Counter />

        }</div>
    )
}

export default Home

Bu kod, Home adlı bir React fonksiyon bileşenini tanımlar. Bileşen, iki alt bileşeni (Counter ve Auth) içeren bir yapıya sahiptir. Ayrıca, Redux’un useSelector hook’u kullanılarak Redux store’undan alınan isAuth durumu, kullanıcının kimlik doğrulama durumunu temsil eder.

Bileşenin içeriği şu şekildedir: Eğer isAuth durumu true ise (isAuth === true), kullanıcı kimlik doğrulaması yapılmış demektir ve bu durumda Auth bileşeni (<Auth />) render edilir. Eğer isAuth false ise, yani kimlik doğrulama yapılmamışsa, Counter bileşeni (<Counter />) render edilir.

Bu yapı, kullanıcı kimlik doğrulamasına bağlı olarak farklı bileşenlerin görüntülendiği bir ana sayfa tasarımını temsil eder. Yani, eğer kullanıcı giriş yapmışsa Auth bileşeni görüntülenir; aksi takdirde, Counter bileşeni görüntülenir.

Auth.jsx

import React, { useState } from 'react';
import './Auth.css';
import { useDispatch } from 'react-redux';
import {authAction} from '../../ReduxToolkitStore/CounterStore';

function Auth() {
    const [username, setUsername] = useState('');
    const [password, setPassword] = useState('');

    const {login} = authAction;
    const dispatch = useDispatch();

    const handleSubmit = (event) => {
        event.preventDefault();
        
        if(username === 'admin' && password === 'admin') {
            dispatch(login());
        }
    }

    return (
        <div className="auth-container">
            <form onSubmit={handleSubmit} className="auth-form">
                <input type="text" placeholder="Username" value={username} onChange={(e) => setUsername(e.target.value)} />
                <input type="password" placeholder="Password" value={password} onChange={(e) => setPassword(e.target.value)} />
                <button type="submit">Login</button>
            </form>
        </div>
    );
}

export default Auth;

Bu kod, bir kullanıcı kimlik doğrulama formunu temsil eden bir Auth bileşenini tanımlar. Bileşen, iki adet useState hook’u kullanarak username ve password adında iki giriş alanının içeriğini tutar. Redux’un useDispatch hook’u ile Redux store’a dispatch işlemleri gerçekleştirmek için bir dispatch fonksiyonu elde edilir.

Bileşenin içeriği şu şekildedir: Bir form elemanı içerisinde kullanıcı adı (username) ve şifre (password) giriş alanları ile bir “Giriş Yap” butonu bulunur. Kullanıcı formu doldurup “Giriş Yap” butonuna tıkladığında, handleSubmit fonksiyonu çağrılır. Bu fonksiyon, formun varsayılan davranışını (sayfanın yeniden yüklenmesini) engeller (event.preventDefault()) ve ardından girilen kullanıcı adı ve şifrenin kontrolünü yapar.

Eğer kullanıcı adı “admin” ve şifre “admin” ise, Redux store’a bir login action’u dispatch edilir. Bu sayede, Redux store’da bulunan auth state’i güncellenir ve kullanıcının giriş yapmış olduğu bilgisi saklanır.

Bileşen, genel olarak kullanıcı kimlik doğrulama işlemlerini gerçekleştiren bir form bileşenidir.

Auth.css

.auth-container {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    
}

.auth-form {
    display: flex;
    flex-direction: column;
    gap: 10px;
    width: 250px;
    height: 150px;
    border-radius: 20px;
    padding: 30px;
    background-color: #73787e;
}

.auth-form input {
    padding: 10px;
    font-size: 16px;
    border-radius: 20px;
    border:none;
}

.auth-form button {
    padding: 10px;
    font-size: 16px;
    background-color: #c8ff00;
    color: rgb(0, 0, 0);
    border: none;
    cursor: pointer;
    border-radius: 20px;
    border:none;
}

Counter.jsx

import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import './Counter.css';
import {counterAction} from '../../ReduxToolkitStore/CounterStore';
import {authAction} from '../../ReduxToolkitStore/CounterStore';

function Counter() {
    const { counter, toggleButton } = useSelector(state => ({
        counter: state.counter.counter,
        toggleButton: state.counter.toggleButton
    }));

    const {logout} = authAction;

    const {increment, increaseByFive, decrement, clear, showButton} = counterAction;

    const logoutHandler = () => {   

        dispatch(logout());
    }

    const dispatch = useDispatch();

    const incrementHandler = () => {
        dispatch(increment());
    }

    const decrementHandler = () => {
        dispatch(decrement());
    }

    const increaseByFiveHandler = () => {
        dispatch(increaseByFive({value:5}));
    }

    const clearHandler = () => {
        dispatch(clear());
    }

    const toggleHandler = () => {
        dispatch(showButton());
    }


    return (
        <div className="counter">
            <h1>Counter: {counter}</h1>

            {
                toggleButton && <div className="button-container">
                    <button onClick={incrementHandler}>
                        Increase
                    </button>
                    <button onClick={decrementHandler}>
                        Decrease
                    </button>
                    <button onClick={increaseByFiveHandler}>
                        Increase by 5
                    </button>
                    <button onClick={clearHandler}>
                        Clear
                    </button>
                    <button onClick={logoutHandler}>
                        Logout
                    </button>


                </div>
            }

            <div className="button-container">
                <button onClick={toggleHandler}>
                    ToggleButton
                </button>
            </div>
        </div>
    );
}

export default Counter;

u kod, bir sayaç uygulamasını yöneten ve Redux Toolkit kullanarak state yönetimini gerçekleştiren bir Counter bileşenini tanımlar. useSelector ve useDispatch hook’ları, Redux store ile etkileşimde bulunmak için kullanılır.

counter ve toggleButton state’leri, useSelector ile Redux store’dan alınır ve bu değerlere erişim sağlanır. authAction ve counterAction nesneleri aracılığıyla, Redux store’a dispatch işlemleri gerçekleştirmek için gerekli action’lar alınır.

Bileşenin içeriği şu şekildedir: Bir başlık (<h1>) içinde mevcut sayaç değeri görüntülenir. Ardından, toggleButton durumu doğrultusunda bir dizi buton görüntülenir. Eğer toggleButton true ise, arttırma, azaltma, 5 birim arttırma, sıfırlama ve çıkış yapma işlemlerini gerçekleştiren butonlar görüntülenir. Çıkış yapma işlemi, logoutHandler fonksiyonu aracılığıyla authAction‘daki logout action’u kullanılarak gerçekleştirilir. Toggle işlemi ise toggleHandler fonksiyonu ile showButton action’u kullanılarak yapılır.

Bu bileşen, sayacın değerini artırma, azaltma, sıfırlama, belirli bir değer kadar artırma ve çıkış yapma gibi temel işlemleri gerçekleştiren bir kullanıcı arayüzü sunar. Toggle butonu ile kullanıcı, ilgili butonları görüntülemeyi veya gizlemeyi seçebilir.

CounterStore.js

import { createSlice, configureStore } from "@reduxjs/toolkit";

const counterState = {
    counter: 0,
    toggleButton: true,
};

const authState = {
    isAuth: true,
};

const authSlice = createSlice({

    name: "auth",
    initialState: authState,
    reducers: {
        login: (state) => {
            state.isAuth = false;
        },
        logout: (state) => {
            state.isAuth = true;
        },
    },

});

const counterSlice = createSlice({
    name: "counter",
    initialState: counterState,
    reducers: {
        increment: (state) => {
            state.counter += 1;
        },
        decrement: (state) => {
            state.counter -= 1;
        },
        increaseByFive: (state, action) => {
            state.counter += action.payload.value;
        },
        clear: (state) => {
            state.counter = 0;
        },
        showButton: (state) => {
            state.toggleButton = !state.toggleButton;
        },
    },
});

const store = configureStore({
    reducer: { counter: counterSlice.reducer, auth: authSlice.reducer },
});

export const counterAction = counterSlice.actions;
export const authAction = authSlice.actions;

export default store;

Bu kod, Redux Toolkit kullanarak iki ayrı slice (parça) oluşturarak bir Redux store’u yapılandırır. İki slice, counter ve auth olarak adlandırılır, ve her biri kendi başlangıç durumunu, reducer’ını ve action’larını içerir.

auth slice’ı, kullanıcı kimlik durumunu temsil eder. login ve logout adında iki action’u vardır. login action’u çağrıldığında, kullanıcının kimlik doğrulama durumu (isAuth) false olarak güncellenir; logout action’u ise kullanıcı çıkış yaptığında durumu tekrar true yapar.

counter slice’ı, sayacın durumunu ve sayacın üzerinde gerçekleştirilebilecek işlemleri temsil eder. Bu slice’ta increment, decrement, increaseByFive, clear ve showButton adında beş adet action bulunur. Bu action’lar, sırasıyla sayacı bir birim artırma, azaltma, belirli bir değer kadar artırma, sıfırlama ve buton görünürlüğünü toggle etme işlemlerini gerçekleştirir.

Bu iki slice, configureStore fonksiyonu içinde birleştirilerek tek bir Redux store’u oluşturulur. counterSlice.actions ve authSlice.actions kullanılarak action’lar dışa aktarılır ve bu sayede bileşenler bu action’ları kullanarak Redux store ile etkileşimde bulunabilirler.

Sonuç olarak, bu kod, kullanıcı kimlik durumu ve sayacın durumu üzerinde gerçekleştirilebilecek çeşitli işlemleri yöneten bir Redux store’u sağlar.

Uygulama Testleri

Bu yazımızda bu kadardı.

Bir sonrakinde görüşmek üzere.


Murat Bilginer
21 Şubat 1992'de doğdum. Endüstri Mühendisi olarak lisansımı 2016 yılında tamamladım. Industryolog Akademi - NGenius oluşumlarının kurucusuyum. Şu anda kendi şirketim Brainy Tech ile Web ve Mobil Geliştirme, AWS, Google Cloud Platform Sistemleri için DevOps, Big Data Analiz ve Görselleştirme hizmetleri sunmakta ve Online Eğitimler vermekteyiz.