22-23 GDSC Sookmyung Core Member로서 React 스터디를 담당하게 되었는데, 심화 스터디 주제로 Redux를 공부하게 되어 개인적으로 정리해 보았다.
getState()
: 현재 state를 가져오는 메소드subscribe()
: 변화를 감지하는 메소드{
type: 'ACTION_CHANGE_USER', // 필수
payload: { // 옵션
name: 'myname',
age: 25
}
}
dispatch()
메소드 사용dispatch()
: Reducer에게 보내는 메시지Counter
import { createStore } from "redux";
const form = document.getElementById("form");
const input = document.getElementById("input");
const ul = document.querySelector("ul");
// Reducer: modify state
const countModifier = (count = 0, action) => { // default state = 0
console.log(action);
// Action
switch (action.type) {
case ADD:
return count + 1;
case MINUS:
return count - 1;
default:
return count;
}
};
// Store: data area
const countStore = createStore(countModifier);
const onChange = () => {
number.innerText = countStore.getState();
}
countStore.subscribe(onChange);
// sending message
const handleAdd = () => {
countStore.dispatch({ type: ADD });
};
const handleMinus = () => {
countStore.dispatch({ type: MINUS });
};
add.addEventListener("click", handleAdd);
minus.addEventListener("click", handleMinus);
Redux를 위한 공식 React 바인딩
import React from "react";
import ReactDOM from "react-dom/client";
import { Provider } from "react-redux";
import store from "./store";
import App from "./components/App";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<Provider store={store}>
<App />
</Provider>
);
mapStateToProps
: hooks에서는 useSelector
, redux에서는 getState
mapDispatchToProps
: hooks에서는 useDispatch
, redux에서는 dispatch
효율적인 Redux 개발을 위한 모든 것을 제공하는 공식 도구
createAction
: type & payload로 구성된 객체 반환createReducer
: 새로운 state를 리턴하거나 state를 mutate할 수 있다.configureStore
: redux의 createStore. redux-toolkit 사용 가능createSlice
: action + reducersstore.js
import { createSlice, configureStore } from "@reduxjs/toolkit";
// action + reducers
const toDos = createSlice({
name: "toDosReducer",
initialState: [],
reducers: {
add: (state, action) => {
state.push({ text: action.payload, id: Date.now() });
},
remove: (state, action) => {
state.filter((toDo) => toDo.id !== action.payload);
},
},
});
const store = configureStore({ reducer: toDos.reducer });
export const { add, remove } = toDos.actions;
export default store;