728x90
반응형
이번 포스트에는 리덕스 미들웨어중 하나인 리덕스 툴킷에 대해 알아보겠다.
전에는 Redux-Thunk 를 사용하였지만 비교를 위해서도 그렇고 사용하기 편하고 확장성이 유용하다 하여
툴킷을 사용해보게 됐다.
1. 먼저 필요한 모듈들을 설치한다.
$npm i react-redux next-redux-wrapper @reduxjs/toolkit
$npm i -D @types/react-redux typescript
2. src 폴더 밑에 store 폴더를 만들고 다음과 같이 정의 할 state를 추가해준다.
( createSlice 함수로 만들기에 파일 이름 뒤에 Slice를 붙였다.)
src/store/features/user/userSlice
import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'
import axios from 'axios'
// 인터페이스
export interface UserInterface {
number : Number;
}
// state 초기값
const initialState: UserInterface = {
number = 0;
}
export const userSlice = createSlice({
name: 'user',
initialState,
reducers: {
increment: (state: UserInterface) => {
state.number += 1;
},
},
})
// 액션의 이름을 담아준다 ( CreateSlice 으로 선언한 액션은 생략 가능 !)
export const { increment } = userSlice.actions;
export default userSlice.reducer;
3. store 폴더 밑에 index.ts파일을 만들고 store를 정의해준다.
이 때 중요한 점은 nextJS에서 쓸 땐 createWrapper 메소드로 wrapper를 만들어주어야 한다.
src/store/index.ts
import { configureStore } from '@reduxjs/toolkit'
import { createWrapper } from 'next-redux-wrapper';
import userSlice from './features/user/userSlice'
export const store: any = () => configureStore({
reducer: {
user: userSlice
},
})
// nextjs 에서 쓸 때는 wrapper를 만들어주어야 한다!
export const wrapper = createWrapper(store, {
debug: process.env.NODE_ENV !== "production",
});
export type RootState = ReturnType<typeof store.getState>
export type AppDispatch = typeof store.dispatch
4. _app.tsx 폴더에서 Component 에 wrapper를 씌어준다.
pages/_app.tsx
import "../styles/globals.css";
import type { AppProps } from "next/app";
import { NextPage } from "next";
import React from "react";
import { wrapper } from '../src/store' // redux-store
const MyApp: NextPage<AppProps> = ({ Component, pageProps }: AppProps) => {
return (
<React.StrictMode>
<Component {...pageProps} />
</React.StrictMode>
);
};
export default wrapper.withRedux(MyApp);
5. 이제 원하는 곳에 useDispatch와 useSelector를 이용해 상태를 관리할 수 있다!
...
import { useDispatch, useSelector } from "react-redux";
...
const userState = useSelector((state: RootState) => state.user)
const userDispatch = useDispatch();
...
useEffect(()=>{
userDispatch(increment());
},[])
728x90
반응형
'Front-End > Next.js' 카테고리의 다른 글
Next.js | eslint plugin 설정하기 (0) | 2022.02.24 |
---|---|
Next.js | Redux-toolkit in Next.js( typescript ) | createAsyncThunk 비동기 API 관리 (0) | 2022.02.22 |
Next.js | 나만의 React Scheduler Calendar 만들기 ( 캘린더 객체화 ) (0) | 2022.01.06 |
Next.js | Json in Json 상태 관리 (0) | 2022.01.04 |
Next.js | 기본기능 | userAgent 정보 확인하기 (0) | 2021.11.03 |