๐Ÿฑ #12 React.js - Redux toolkit

๋ฐ•์ค€์„ยท2022๋…„ 11์›” 14์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
13/13
post-thumbnail

๐Ÿงฉ Redux toolkit ์„ค์น˜

Redux toolkit๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์„ค์น˜๋ฅผ ํ•ด์•ผํ•œ๋‹ค

npm install @reduxjs/toolkit

Redux toolkit์„ ์„ค์น˜ํ•˜๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ Redux๊ฐ€ ์„ค์น˜๋œ๋‹ค.

๐Ÿงฉ Redux toolkit ์ ์šฉ

  • ์ด์ „๋ฌธ๋ฒ•
let initialState = {
    productList: [],
    selectedItem: null,
}

function productReducer(state = initialState, action) {
    let { type, payload } = action;
    switch (type) {
        case "GET_PRODUCT_SUCCESS":
            return { ...state, productList: payload.data };
        case "GET_SINGLE_PRODUCT_SUCCESS":
            return { ...state, selectedItem: payload.data };
        default:
            return { ...state };

    }
}

export default productReducer;

์ด์ „ ๋ฌธ๋ฒ•์€ ๋‹จ์ ์ด ์žˆ๋‹ค.

  1. ๋งค๋ฒˆ ์œ ๋‹ˆํฌํ•œ ์ด๋ฆ„์„ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค.
  2. ๋งค๋ฒˆ if else ๋˜๋Š” switch๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•˜๊ณ 
  3. ์ด๋ฆ„์— ์˜คํƒ€๋„ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๋Š” ๊ฒƒ์ด React toolkit์— createSlice์ด๋‹ค.

๋ฆฌ๋•์Šค ๋ฒ„์ „์ด ๋†’์•„์ง€๋ฉด์„œ createStore๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด์ „๋ฒ„์ „์„ ์“ฐ๋ฉด ๋‹ค์Œ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ์ค„์ด ์ณ์ € ์žˆ๋Š”๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด์ „ ๋ฒ„์ „์€ combinereducer๋ฅผ ์จ์„œ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ํ•ฉ์ณ์•ผํ•˜๊ณ , thunk์™€ applyMiddleware, composeWithDevTools๋ฅผ ์จ์•ผ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ Redux toolkit์€ combinereducer, thunk, applyMiddleware, composeWithDevTools๊ฐ€ ์ž๋™์œผ๋กœ ์…‹์—… ๋˜์–ด ์žˆ๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด์ „ ๋ฌธ๋ฒ•๊ณผ ์ฐจ์ด๋ฅผ ์•Œ์•„๋ณด์ž.

  • ์ด์ „ reducer
let initialState = {
    productList: [],
    selectedItem: null,
}

function productReducer(state = initialState, action) {
    let { type, payload } = action;
    switch (type) {
        case "GET_PRODUCT_SUCCESS":
            return { ...state, productList: payload.data };
        case "GET_SINGLE_PRODUCT_SUCCESS":
            return { ...state, selectedItem: payload.data };
        default:
            return { ...state };

    }
}

export default productReducer;
  • redux toolkit ์ ์šฉ reducer
import { createSlice } from '@reduxjs/toolkit'

let initialState = {
    productList: [],
    selectedItem: null,
}

const productSlice= createSlice({
    name : "product",
    initialState ,
    reducers : {
        getAllProduct(state, action){
            state.productList = action.payload.data;
        },
        getSingleProduct(state, action){
            state.selectedItem = action.payload.data;
        },
    },
});


export const productActions = productSlice.actions;
export default productSlice.reducer;
  • ์ด์ „ store
import {createStore, applyMiddleware} from "redux";
import thunk from 'redux-thunk'
import rootReducer from "./reducers";
import { composeWithDevTools } from 'redux-devtools-extension';

let store = createStore(
    rootReducer, composeWithDevTools(applyMiddleware(thunk))
    );


export default store;

์ด์ „ store๋Š” ๋”ฐ๋กœ combinereducer๊ฐ€ ์žˆ์–ด์•ผ ํ–ˆ์ง€๋งŒ Redux toolkit์„ ์‚ฌ์šฉํ•˜๋ฉด ๋” ํŽธ๋ฆฌํ•˜๋‹ค.

  • redux toolkit ์ ์šฉ store
import { configureStore } from "@reduxjs/toolkit";
import authenticateReducer from './reducers/authenticateReducer'
import productSlice from './reducers/productReducer'

const store = configureStore({
    reducer:{
        auth : authenticateReducer,
        product : productSlice
    }
})

export default store;
  • ์ด์ „ dispatch
import {productActions} from "../reducers/productReducer"



function getProducts(searchQuery) {
    return async (dispatch, getState) => {
        let url = `https://my-json-server.typicode.com/jjunseokk/hnm-site/products?q=${searchQuery}`;
        let response = await fetch(url);
        let data = await response.json();
        dispatch({type : "GET_PRODUCT_SUCCESS", payload : {data}});
    };
}

function getProductDetail(id) {
    return async(dispatch, getState) =>{
        let url = `https://my-json-server.typicode.com/jjunseokk/hnm-site/products/${id}`
        let response = await fetch(url)
        let data = await response.json();
        dispatch({type : "GET_SINGLE_PRODUCT_SUCCESS", payload : {data}});
    };
}


export const productAction={getProducts, getProductDetail};
  • redux toolkit ์ ์šฉ dispatch
import {productActions} from "../reducers/productReducer"



function getProducts(searchQuery) {
    return async (dispatch, getState) => {
        let url = `https://my-json-server.typicode.com/jjunseokk/hnm-site/products?q=${searchQuery}`;
        let response = await fetch(url);
        let data = await response.json();
        dispatch(productActions.getAllProduct({data}));
    };
}

function getProductDetail(id) {
    return async(dispatch, getState) =>{
        let url = `https://my-json-server.typicode.com/jjunseokk/hnm-site/products/${id}`
        let response = await fetch(url)
        let data = await response.json();
        dispatch(productActions.getSingleProduct({data}));
    };
}


export const productAction={getProducts, getProductDetail};

Redux toolkit์„ ์‚ฌ์šฉํ•˜๋ฉด ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

profile
์•ˆ๋…•ํ•˜์„ธ์š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค. ๊ธ€์„ ์ด์ „ ์ค‘์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€