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;
// 우리가 추가할 코드
import store from "./redux/config/configStore";
import { Provider } from "react-redux";
모듈
이란, State들의 그룹이다.지금부터 할 실습은 카운터 프로그램
useState 로 만들었던 것을 리덕스로 다시 만들어보자.
모듈은 카운터 프로그램에 필요한 State들이 모여있는 모듈이 될 것
// 초기 상태값
const initialState = {
number: 0,
};
//참고용
const [number, setNumber] = useState(0)
단어 그대로 초기 상태값. 즉, 어떤 State의 초기값을 정해주는 것 입니다. 우리가 useState를 사용했을 때 괄호 안에 초기값을 지정해주던 것과 같다.
State의 초기값은 꼭 객체가 아니어도 됩니다. 배열이 되어도 되고, 그냥 원시데이터가 돼도 됩니다.
// 초기값이 0
const initialState = 0;
// 초기값이 0이 있는 배열
const initialState = [0];
// 초기값이 number = 0, name = '석구'인 객체
const initialState = {
number: 0,
name: '석구'
};
리듀서란, 변화를 일으키는 함수
// 리듀서
const counter = (state = initialState, action) => {
switch (action.type) {
default:
return state;
}
};
우리가 useState()
를 사용할 때, number라는 값을 바꾸고 싶으면 setNumber를 사용했습니다.
아래 코드 처럼 number값을 변경할 수 있었습니다.
// setNumber예시 코드
const onClickHandler = () => {
setNumber(number + 1);
// setState를 이용해서 state 변경
}
리덕스에서는 리듀서가 이 역할을 합니다.
리듀서의 인자에 보면 (state = intialState, action)
이라고 되어 있습니다.
우리는 리듀서 인자 첫번째 자리에서는 state
를, 두번째 자리에서는 action
이라는 것을 꺼내서 사용할 수 있습니다.state = intialState
처럼 state
에 initialState
를 할당해줘야 한다는걸 기억!
아직까진 모듈과 스토어가 각각 따로 분리되어 있는 상태이기 때문에 이제 우리가 만든 모듈을 스토어에 연결 시켜야 함.
// 새롭게 추가한 부분
import counter from "../modules/counter";
const rootReducer = combineReducers({
counter: counter, // <-- 새롭게 추가한 부분
});
스토어와 모듈이 연결 완료!
이제 눈으로 확인을 하러가자!!!!
모듈을 스토어에 잘 연결했는지 확인하는 방법은 컴포넌트에서 스토어를 직접 조회하면 됩니다. 컴포넌트에서 리덕스 스토어를 조회하고자 할때는 useSelector
라는 ‘react-redux’의 훅을 사용해야 합니다.
// 1. store에서 꺼낸 값을 할당 할 변수를 선언합니다.
const number =
// 2. useSelector()를 변수에 할당해줍니다.
const number = useSelector()
// 3. useSelector의 인자에 화살표 함수를 넣어줍니다.
const number = useSelector( ()=>{} )
// 4. 화살표 함수의 인자에서 값을 꺼내 return 합니다.
//우선 콘솔로 확인해보자.
const number = useSelector((state) => {
console.log(state)
return state
});
App.jsx
// 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;
우리는 컴포넌트에서 스토어를 조회할 때 react-redux
에서 제공하는 useSelector
라는 훅을 사용합니다. (너무너무 중요 🔥)
initialState
, Reducer
가 있다.configStore.js
에서 한다.useSelector
를 사용해야 한다.useSelector((state)⇒state)
에서 state
는 모든 모듈의 state 를 조회할 수 있는 값이다.