예시
const store = createStore(리듀서);
실습
파일 생성
action.js
// 1.액션의 타입을 정의하여 변수로 빼는 단계 const ADD_TODO = "ADD_TODO"; // 2.액션 객체를 만들어 내는 함수를 만드는 단계 function addTodo(todo) { return { type: ADD_TODO, // 액션의 타입 지정 todo, // 액션이 할일 지정 (payload) } }
- reducers.js
import { ADD_TODO } from "./actions" export function todoApp(previousState, action) { // 초기값을 설정해주는 단계 if (previousState === undefined) { return [] } if (action.type === ADD_TODO) { return [...previousState, action.todo] } return previousState }
현재
State
의 초기값이undefined
이므로reducers.js
에서 빈 배열[]
을 리턴store.js
import { createStore } from "redux" import { todoApp } from "./reducers" const sotre = createStore(todoApp) export default sotre
createStore
함수로sotre
생성index.js
import React from "react" import ReactDOM from "react-dom/client" import "./index.css" import App from "./App" import reportWebVitals from "./reportWebVitals" import sotre from "./redux/sotre" console.log(sotre) console.log(sotre.getState()) const root = ReactDOM.createRoot(document.getElementById("root")) root.render( <React.StrictMode> <App /> </React.StrictMode> ) reportWebVitals()
import
키워드로store
가져오기
sotre
객체와sotre
의 현재state
값을 콘솔에 출력실행 결과
sotre
의 현재state
값으로reducers.js
에서 설정한 빈 배열[]
이 출력됨
- action.js
// 1.액션의 타입을 정의하여 변수로 빼는 단계 const ADD_TODO = "ADD_TODO"; // 2.액션 객체를 만들어 내는 함수를 만드는 단계 function addTodo(todo) { return { type: ADD_TODO, // 액션의 타입 지정 todo, // 액션이 할일 지정 (payload) } }
addTodo
함수를export
키워드로 내보내기index.js
import React from "react" import ReactDOM from "react-dom/client" import "./index.css" import App from "./App" import reportWebVitals from "./reportWebVitals" import sotre from "./redux/sotre" import { addTodo } from "./redux/actions" console.log(sotre) console.log(sotre.getState()) sotre.dispatch(addTodo("coding")) console.log(sotre.getState()) const root = ReactDOM.createRoot(document.getElementById("root")) root.render( <React.StrictMode> <App /> </React.StrictMode> ) reportWebVitals()
import
키워드로addTodo
함수 가져오기sotre.dispatch
를 이용하여addTodo
함수에서state
값으로 문자열codeing
을 추가- 기존의
state
값과 변경된state
상태값을 콘솔창에 출력하여 비교 합니다.실행 결과
- 기존의
state
값: 빈 배열[]
- 변경된
state
값:['coding']
const unsubscribe = sotre.subscribe(() => {})
index.js
import React from "react" import ReactDOM from "react-dom/client" import "./index.css" import App from "./App" import reportWebVitals from "./reportWebVitals" import sotre from "./redux/sotre" import { addTodo } from "./redux/actions" // 상태가 바뀔때마다 기록합니다. const unsubscribe = sotre.subscribe(() => { // sotre의 변경사항을 구독 => 즉, dispatch가 발생할때 마다 함수가 실행됨 console.log(sotre.getState()) }) // 액션을 보냅니다. sotre.dispatch(addTodo("coding")) sotre.dispatch(addTodo("read book")) sotre.dispatch(addTodo("eat")) // 상태 변경을 더 이상 받아보지 않습니다. unsubscribe() sotre.dispatch(addTodo("end")) const root = ReactDOM.createRoot(document.getElementById("root")) root.render( <React.StrictMode> <App /> </React.StrictMode> ) reportWebVitals()
실행 결과
unsubscribe()
이전의 액션은 모두 출력되지만unsubscribe()
이후의 액션은 출력되지 않습니다.
ActionCreator (액션 생성자)
// 1.액션의 타입을 정의하여 변수로 빼는 단계 const ADD_TODO = "ADD_TODO"; // 2.액션 객체를 만들어 내는 함수를 만드는 단계 function addTodo(todo) { return { type: ADD_TODO, // 액션의 타입 지정 todo, // 액션이 할일 지정 (payload) } }
- 액션을 생성하기 위한 함수
createSotre(reducer) (Store 생성)
import { createStore } from "redux" import { todoApp } from "./reducers" const sotre = createStore(todoApp) export default sotre
store
를 생성할 때 사용- 매개변수로
reducer
를 전달createSotre
에는4
개의 메소드가 들어있다.(getState
,dispatch
,subscribe
,replaceReducer
)
- store.getState()
console.log(sotre.getState())
getState()
는 현재의state
의 값을 가져옴
store.dispath(액션) || store.dispath(액션생성자())
import sotre from "./redux/sotre" sotre.dispatch(addTodo("coding")) sotre.dispatch(addTodo("read book")) sotre.dispatch(addTodo("eat"))
dispath()
는 인자값으로 액션을 받아state
의 값을 변경 해줌
const unsubscribe = sotre.subscribs(() => { })
const unsubscribe = sotre.subscribe(() => { // sotre의 변경사항을 구독 => 즉, dispatch가 발생할때 마다 함수가 실행됨 console.log(sotre.getState()) }) sotre.dispatch(addTodo("coding")) sotre.dispatch(addTodo("read book")) sotre.dispatch(addTodo("eat")) unsubscribe()
subscribs(() => { })
는store
의state
값이 변경이 생겼을때 화살표(callback
) 함수를 실행subscribs(() => { })
함수의 리턴되는 결과물이unsubscribe
unsubscribe();
하면subscribs()
가 제거됨
store.replaceReducer(다른리듀서)
replaceReducer()
는 원래가지고 있던 리듀서를 다른 리듀서로 변경 해줌