React/Library

[ React ] redux

Design-loving front-end engineer 2022. 8. 2. 09:13

๐Ÿ”ด  Introduction

โšช  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 

๐ŸŸ   Official

 

Redux ์‹œ์ž‘ํ•˜๊ธฐ | Redux

์†Œ๊ฐœ > ์‹œ์ž‘ํ•˜๊ธฐ: Redux๋ฅผ ๋ฐฐ์šฐ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ž๋ฃŒ

ko.redux.js.org

 

๐ŸŸก  Install

 
npm i redux react-redux
npm i @reduxjs/toolkit
npm i redux-logger
npm i redux-thunk

 

๐ŸŸข  Usage

 
// [ index.jsx ]
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import { Provider } from "react-redux";
import store from "./store/store";

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <>        
    <Provider store={store}>
      <App />
    </Provider>
  </>
);
 
// [ store.js ]
import { configureStore } from "@reduxjs/toolkit";
import logger from "redux-logger";
import ReduxThunk from "redux-thunk";
import pageReducer from "./slices/pageSlice";

const store = configureStore({
    reducer: {
        page: pageReducer,
    },
    middleware: (getDefaultMiddleware) => [
        ...getDefaultMiddleware({ serializableCheck: false }),
        logger,
        ReduxThunk,
    ],
});

export default store;
 
// [ pageSlice.js ]
import { createSlice } from "@reduxjs/toolkit";

export const PageSlice = createSlice({
    name: "page",
    initialState: {
        currentPage: "1",
    },
    reducers: {
        setCurrentPage: (state, { payload }) => {
            state.currentPage = payload;
        },
    },
});

// redux-thunk function usage
export const checkValid =
    ({ keys, onSuccess = (f) => f, onFail = (f) => f }) =>
    (dispatch, getState) => {
        // dispatch ์ด์ „์— ๋จผ์ € ์ฒ˜๋ฆฌํ•  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„
        if (keys) return onSuccess();
        return onFail();
    };

export const { setCurrentPage } = PageSlice.actions;
export default PageSlice.reducer;
 
// [ Usage Component ]
import { useSelector, useDispatch } from "react-redux";
import { setCurrentPage } from "../../store/slices/pageSlice";

const Component = () => {
  // set redux state
  const dispatch = useDispatch();
  const setPage = dispatch(setCurrentPage((prev) => prev + 1));
  
  // get redux state
  const curPage = useSelector((state) => state.page.currentPage);
  
  // usage of redux-thunk
  dispatch(checkValid({ option });
}