⭐ 설치방법
npm i redux react-redux
npm i redux
✔️ 프로젝트 구조
- redux 폴더 - 리덕스 관련 파일 저장
- config 폴더 - 리덕스 설정 관련 파일 저장
- configStore - 상태 관리하는 곳. rootReducer 존재함
- modules 폴더 - 기능별로 나눠서 저장
⭐기본세팅
✔️ /src/redux/config/configStore.js
import { createStore } from "redux";
import { combineReducers } from "redux";
const rootReducer = combineReducers({});
const store = createStore(rootReducer);
export default store;
createStore()
: 스토어를 만드는 함수. 프로젝트 전체에 하나만 존재하므로 이 파일말고 다른데서 쓰일 일 없음.
combineReducers()
: redux는 action -> dispatch -> reducer 순서로 동작함.
reducer를 기능 별로 나누어서, 여러 개의 reducer를 하나의 상태 객체로 만들어주는 함수.
✔️ /src/index.js
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import store from "./redux/config/configStore";
import { Provider } from "react-redux";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<Provider store={store}>
<App />
</Provider>
);
App을 Provider로 감싸주고 Provider에 store를 넣어준다.
이렇게 기본 세팅이 🚨완료🚨되었다.
⭐ Ducks 패턴
- Ducks 패턴은 리덕스 사용 방법에 대한 패턴이다.
- 액션 타입, 액션 생성 함수, 리듀서를 하나의 모듈처럼 한 파일 안에 작성하는 패턴이다.
- 하나의 기능을 수정할 때, 한 파일 안에서 수정 가능하다는 장점이 있다.
✔️ Ducks 패턴의 규칙
- MUST export default a function called reducer()
반드시 리듀서 함수를 default export해야 한다. - MUST export its action creators as functions
반드시 액션 생성 함수를 export해야 한다. - MUST have action types in the form npm-module-or-app/reducer/ACTION_TYPE
반드시 접두사를 붙인 형태로 액션 타입을 정의해야 한다. - MAY export its action types as UPPER_SNAKE_CASE, if an external reducer needs to listen for them, or if it is a published reusable library
(필수❌) 외부 리듀서가 모듈 내 액션 타입을 바라보고 있거나,
모듈이 재사용 가능한 라이브러리로 쓰이는 것이라면
액션 타입을 UPPER_SNAKE_CASE 형태로 이름 짓고 export 하면 된다.
⭐ 예제
✔️ /src/modules/ex.js
간단한 카운터 예제
//Ducks 패턴을 따름
//액션 타입
const INCREASE = "counter/INCREASE";
const DECREASE = "counter/DECREASE";
//액션 생성 함수
export const increase = () => ({ type: INCREASE });
export const decrease = () => ({ type: DECREASE });
//Ducks 패턴에서는 액션 타입을 정의할 때 위처럼 접두사를 붙임(다른 모듈과 이름 중복되지 않기 위해서)
//모듈 초기 상태
const initialState = {
number: 0,
};
//reducer
export default function counter(state = initialState, action) {
switch (action.type) {
case INCREASE:
return {
...state,
number: state.number + 1,
};
case DECREASE:
return {
...state,
number: state.number - 1,
};
default:
return state;
}
}
✔️ configStore.js 수정
import { createStore } from "redux";
import { combineReducers } from "redux";
import ex from "../modules/ex.js";
const rootReducer = combineReducers({ ex });
const store = createStore(rootReducer);
export default store;
⭐ 컴포넌트에서 사용하는 방법
import "./App.css";
import { useSelector } from "react-redux";
function App() {
const number = useSelector((state) => state.ex.number);
return (
<div className="App">
<header className="App-header">{number}</header>
</div>
);
}
export default App;
useSelector 훅을 사용해서 접근 할 수 있다.
위의 코드를 실행한다면 초기 값인 0을 가져오는 걸 확인할 수 있다!
'React' 카테고리의 다른 글
[React]react-hook-form로 회원가입 구현 (1) | 2024.03.07 |
---|---|
[React]Redux-Logger (0) | 2024.02.08 |
[React]React Redux란? (1) | 2024.02.02 |
[React] API 통신 - axios (0) | 2024.01.16 |
[React]리액트 훅 & Life Cycle (0) | 2023.10.04 |