store.dispatch
함수의 인자로 담겨 ‘reducer에 store를 어떻게 변경시킬 것인가’에 대한 정보 제공const rootReducer = (state: AppState = initialState, action: LoginActions): AppState => {
switch (action.type){
case '액션_타입1' :
return {...state} // 액션타입 1을 반영한 새로운 상태 반환
case '액션_타입2' :
return {...state} // 액션타입 1를 반영한 새로운 상태 반환
}
return state;
}
store.dispatch()
형태로 제공됨.(previousState, action) => newState
의 형태로 이전 상태값과 액션 객체를 입력으로 받아 새로운 상태값 출력업데이트 되기 이전의 Store를 기반으로 새로 받은 Action에 미리 준비된 로직을 처리해 새로운 Store를 리턴하는 함수.
즉, 감지된 Action 타입에 따라 이벤트를 처리하는 ‘이벤트 리스너’로 생각할 수 있음// Reducer 함수 의미
const rootReducer = (previousState: AppState, action: Action) => {
const newState =
return newState
}
구분
Root Reducer
: createStore
의 첫 번째 인자로 전달되는 함수로 유일하게 (state, action) => newState
형태의 로직 구현
Slice Reducer
: 상태 트리의 일부분만을 업데이트하는 리듀서로 여러 Slice Reducer들이 결합(combineReducers
)되어 Root Reducer를 구성하게 됨 (*Linco에서 페이지 기능별 profileSlice, walletSlice 등 사용):: 유의사항
불변성을 지켜 업데이트 한다.
Reducer 내부에서 비동기나 Side Effect를 처리할 수 없다.
Promise(fetch)
, Math.random()
, new Date()
store.getState()
로 읽어올 수 있음// src/index.js
import React from "react";
import ReactDOM from "react-dom";
import { Provider } from "react-redux";
import { App } from "./App";
import createStore from "./createReduxStore";
const store = createStore();
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<Provider store={store}>
<App />
</Provider>,
);
// redux-thunk
export default function thunkMiddleware({ dispatch, getState }) {
return (next) => (action) =>
typeof action === "function" ? action(dispatch, getState) : next(action);
}
1.앱 수준 상태 타입 선언
type user = {
name: string
email: string
}
type AppState={
loggedIn: boolean
loggedUser: User
}
const initialState: AppState = {
loggedIn: false,
loggedUser: {name: '', email: ''}
}