리덕스 설정
(1) 리덕스 설치
리액트에서 리덕스를 사용하기 위해서는 2개의 패키지를 설치해야 한다.
react-redux 라는 패키지는 리덕스를 리액트에서 사용할 수 있도록 서로 연결시켜주는 패키지이다.
yarn add redux react-redux
아래와 같은 의미
yarn add redux
yarn add react-redux
(2) 폴더 구조 생성하기
설정 코드 작성
(1) src/configStore.js
import { createStore } from "redux";
import { combineReducers } from "redux";
/*
1. createStore()
리덕스의 가장 핵심이 되는 스토어를 만드는 메소드(함수) 입니다.
리덕스는 단일 스토어로 모든 상태 트리를 관리한다고 설명해 드렸죠?
리덕스를 사용할 시 creatorStore를 호출할 일은 한 번밖에 없을 거예요.
*/
/*
2. combineReducers()
리덕스는 action —> dispatch —> reducer 순으로 동작한다고 말씀드렸죠?
이때 애플리케이션이 복잡해지게 되면 reducer 부분을 여러 개로 나눠야 하는 경우가 발생합니다.
combineReducers은 여러 개의 독립적인 reducer의 반환 값을 하나의 상태 객체로 만들어줍니다.
*/
const rootReducer = combineReducers({});
const store = createStore(rootReducer);
export default store;
(2)index.js
// 원래부터 있던 코드
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
// 우리가 추가할 코드
import store from "./redux/config/configStore";
import { Provider } from "react-redux";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
//App을 Provider로 감싸주고, configStore에서 export default 한 store를 넣어줍니다.
<Provider store={store}>
<App />
</Provider>
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
모듈 만들기
(1) 카운터 프로그램을 만들기
(2)첫 모듈 만들기
모듈이란, State의 그룹이다. 첫 모듈은 카운터 프로그램에 필요한 State들이 모여있는 모듈이 될 것이다.
아래 순서대로 파일을 생성하고 코드를 입력해보자.
1.modules 폴더에 counter.js 파일을 생성한다.
2.코드를 작성한다.
// src/redux/modules/counter.js
// 초기 상태값
const initialState = {
number: 0,
};
// 리듀서
const counter = (state = initialState, action) => {
switch (action.type) {
default:
return state;
}
};
// 모듈파일에서는 리듀서를 export default 한다.
export default counter;
모듈의 구성요소 살펴보기
(1) initialState === 초기 상태값
// 초기 상태값
const initialState = {
number: 0,
};
단어 그대로 초기 상태값 입니다. 즉, 어떤 State의 초기값을 정해주는 것.
const [number, setNumber] = useState(0) // < 여기
위 코드에서만든 State의 초기값은 { } (객체) 이고, 그 안에 number 라는 변수에 초기값 0을 할당해준 것이다.
초기값은 꼭 객체가 아니어도 된다. 배열이 되어도 되고, 그냥 원시데이터가 돼도 된다. 그리고 객체에도 여러개의 변수를 넣어줄 수 있다.
// 초기값이 0
const initialState = 0;
// 초기값이 0이 있는 배열
const initialState = [0];
// 초기값이 number = 0, name = '석구'인 객체
const initialState = {
number: 0,
name: '석구'
};
(2) Reducer === 변화를 일으키는 함수
리듀서란, 변화를 일으키는 함수다.
// 리듀서
const counter = (state = initialState, action) => {
switch (action.type) {
default:
return state;
}
};
useState()를 사용할 때, number라는 값을 바꾸고 싶으면 setNumber를 사용했다.
아래 코드 처럼 number값을 변경할 수 있었다.
// 예시 코드
const onClickHandler = () => {
setNumber(number + 1); // setState를 이용해서 state 변경
}
리덕스에서는 리듀서가 이 역할을 한다.
“리듀서야 number에 +1를 해줘" 라고 명령하면, 리듀서는 number에 +1을 더해준다.
// src/redux/modules/counter.js
// counter 리듀서
const counter = (state = initialState, action) => {
switch (action.type) {
default:
return state;
}
};
export default counter; // 여기
리듀서의 인자에 보면 (state = intialState, action) 이라고 되어있다.
리듀서 인자 첫번째 자리에서는 state를, 두번째 자리에서는 action 이라는 것을 꺼내서 사용할 수 있다.
(3) 카운터 모듈을 스토어에 연결하기
우리는 지금까지 모듈파일에서 초기 상태값과 리듀서를 작성했다. 이제 만든 모듈을 스토어에 연결 시켜야 한다.
configStore.js로 이동해서 아래 코드를 추가한다.
// src/redux/config/configStore.js
// 원래 있던 코드
import { createStore } from "redux";
import { combineReducers } from "redux";
// 새롭게 추가한 부분
import counter from "../modules/counter";
const rootReducer = combineReducers({
counter: counter, // <-- 새롭게 추가한 부분
});
const store = createStore(rootReducer);
export default store;
위와 같이 코드를 추가하면, 스토어와 모듈이 연결된다.
스토어와 모듈 연결 확인하기
(1) useSelector = 스토어 조회
생성한 모듈을 스토어에 잘 연결했는지 확인하는 방법은 컴포넌트에서 스토어를 직접 조회하면 된다.
컴포넌트에서 리덕스 스토어를 조회하고자 할때는 useSelector라는 ‘react-redux’의 훅을 사용해야 한다.
useSelector의 사용법은 아래와 같다.
// 1. store에서 꺼낸 값을 할당 할 변수를 선언합니다.
const number =
// 2. useSelector()를 변수에 할당해줍니다.
const number = useSelector()
// 3. useSelector의 인자에 화살표 함수를 넣어줍니다.
const number = useSelector( ()=>{} )
// 4. 화살표 함수의 인자에서 값을 꺼내 return 합니다.
// 우리가 useSelector를 처음 사용해보는 것이니, state가 어떤 것인지 콘솔로 확인해볼까요?
const number = useSelector((state) => {
console.log(state)
return state
});
// src/App.js
import React from "react";
import { useSelector } from "react-redux"; // import 해주세요.
const App = () => {
const counterStore = useSelector((state) => state); // 추가해주세요.
console.log(counterStore); // 스토어를 조회해볼까요?
return <div></div>;
}
export default App;
브라우저를 켜고, 콘솔을 보면 아래 이미지처럼 객체가 보이고, 그 안에 counter 라는 값이 있는 것을 볼 수 있다.
이렇게 화살표 함수에서 꺼낸 state라는 인자는 현재 프로젝트에 존재하는 모든 리덕스 모듈의 state 이다.
이제 우리는 어떤 컴포넌트에서도 접근 할 수 있는 스토어를 가지게 되었다. 만약 컴포넌트에서 number라는 값을 사용하고자 한다면 아래 코드처럼 꺼내서 사용하면 된다.
const number = useSelector(state => state.counter.number); // 0
'웹개발 > react' 카테고리의 다른 글
[React] Redux - 카운터 프로그램 만들기2 (0) | 2024.01.31 |
---|---|
[React] useRef란? useState와의 차이 (0) | 2024.01.31 |
[React] 리덕스(Redux)란 무엇인가? (1) | 2024.01.27 |
[React] DOM과 Virtual DOM (1) | 2024.01.25 |
React Hooks - useContext(Context API)란 무엇인가? (1) | 2024.01.24 |