Redux toolkit๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ค์น๋ฅผ ํด์ผํ๋ค
npm install @reduxjs/toolkit
Redux toolkit
์ ์ค์นํ๋ฉด ์์ฐ์ค๋ฝ๊ฒ Redux
๊ฐ ์ค์น๋๋ค.
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;
์ด์ ๋ฌธ๋ฒ์ ๋จ์ ์ด ์๋ค.
์ด๋ฌํ ๋จ์ ์ ๋ณด์ํ๋ ๊ฒ์ด React toolkit
์ createSlice
์ด๋ค.
๋ฆฌ๋์ค ๋ฒ์ ์ด ๋์์ง๋ฉด์ createStore
๋ฅผ ์ง์ํ์ง ์๋๋ค. ์ด์ ๋ฒ์ ์ ์ฐ๋ฉด ๋ค์ ์ฌ์ง๊ณผ ๊ฐ์ด ์ค์ด ์ณ์ ์๋๊ฒ์ ๋ณผ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด์ ๋ฒ์ ์ combinereducer
๋ฅผ ์จ์ ์ฌ๋ฌ๊ฐ๋ฅผ ํฉ์ณ์ผํ๊ณ , thunk
์ applyMiddleware
, composeWithDevTools
๋ฅผ ์จ์ผ ํ๋ค. ํ์ง๋ง Redux toolkit
์ combinereducer
, thunk
, applyMiddleware
, composeWithDevTools
๊ฐ ์๋์ผ๋ก ์
์
๋์ด ์๋ค๋ ์ฅ์ ์ ๊ฐ์ง๊ณ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด์ ๋ฌธ๋ฒ๊ณผ ์ฐจ์ด๋ฅผ ์์๋ณด์.
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;
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;
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
์ ์ฌ์ฉํ๋ฉด ๋ ํธ๋ฆฌํ๋ค.
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;
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};
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
์ ์ฌ์ฉํ๋ฉด ๋ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ ์ฅ์ ์ด ์๋ค.