react μ€ν°λμμ 리μ‘νΈλ₯Ό λ€λ£¨λ κΈ°μ μ΄λΌλ μ± μ μ μ νκ³ μ΄ μ± μ μ½κ³ λ°°μ΄ κ²μ λ°νμΌλ‘ μμ±λμλ€.
Presentational Component
μ Container Component
λ‘ κ΅¬λΆνμ¬ μμ±νλ€.Presentational Component
: μ£Όλ‘ μν κ΄λ¦¬κ° μ΄λ£¨μ΄μ§μ§ μκ³ , κ·Έμ props
λ‘ μνλ₯Ό λ°μμ μ¨μ ν λ·°λ§ λ΄λΉνλ μ»΄ν¬λνΈContainer Component
: 리λμ€μ μ°λλμ΄ μλ μ»΄ν¬λνΈλ‘, μν μ
λ°μ΄νΈ λ‘μ§μ΄ μ‘΄μ¬νλ€.μ΄μ λ
Presentational Component
μContainer Component
λ₯Ό λΆλ¦¬νλ κ²μ λ μ΄μ κΆμ₯νμ§ μλλ€.Hookμ ν΅ν΄μ μν κ΄λ ¨ λ‘μ§μ μ»΄ν¬λνΈμμ λΆλ¦¬μν¬ μ μκΈ° λλ¬Έμ λ μ΄μ μ»΄ν¬λνΈμ ꡬλΆμ΄ λΆνμν΄μ‘λ€.
type
νλ‘νΌν°λ₯Ό κ°μ ΈμΌ νκΈ° λλ¬Έμ μ‘μ
νμ
μ μ ν΄μΌ νλ€.λͺ¨λμ΄λ¦/μ‘μ
μ΄λ¦
κ³Ό κ°μ ννλ‘ μ μν΄μΌ μ€λ³΅λλ μΌμ΄ λ°μνμ§ μλλ‘ νλ€.const INCREASE = "counter/INCREASE";
export const increase = () => ({type: "INCREASE"});
type
μΈμ μΆκ° μ λ³΄κ° νμλ‘ ν λλ μ‘μ
μμ± ν¨μμ μΈμλ‘ μ λ¬νμ¬ ν΄λΉ μ 보λ₯Ό λ΄μ μ‘μ
κ°μ²΄λ₯Ό λ°ννλλ‘ νλ€.createAction
payload
λΌλ νλ‘νΌν°λ‘ μ μλλ€.payload
μ λ£λ κ²μ΄ μλλΌ λ³νμ μ£Όμ΄μ λ£κ³ μΆλ€λ©΄, λ λ²μ§Έ μΈμλ‘ payload
λ₯Ό μ μνλ ν¨μλ₯Ό μ λ¬νλ©΄ λλ€.handleActions
immer
λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ©΄ νΈλ¦¬νκ² λΆλ³μ±μ μ μ§νλ©° μνλ₯Ό μ
λ°μ΄νΈν μ μλ€.produce
produce
ν¨μκ° λΆλ³μ±μ μ§μΌμ£Όκ³ μλ‘μ΄ μνλ₯Ό λ°ννλ€.createStore
ν¨μλ₯Ό μ¬μ©νμ¬ μ€ν μ΄λ₯Ό λ§λ€ λλ νλμ 리λμλ§ μ¬μ©ν΄μΌ νκ³ , ν νλ‘μ νΈ λ΄μμ νλμ μ€ν μ΄λ§ μ‘΄μ¬ν΄μΌ νλ―λ‘ μ¬λ¬ 리λμκ° μ‘΄μ¬ν λλ λ£¨νΈ λ¦¬λμλ₯Ό λ§λ λ€.combineReducers
ν¨μλ₯Ό μ΄μ©νλ€.// modules/index.js
const rootReducer = combineReducers({
counter,
todos
});
export default rootReducer;
createStore
ν¨μμ μΈμλ‘ rootReducer
λ₯Ό μ λ¬νλ€.App
μ react-redux
μμ μ 곡νλ Provider
μ»΄ν¬λνΈλ‘ κ°μΌλ€.Provider
μ»΄ν¬λνΈμ store props
λ‘ μμ λ§λ store
λ₯Ό μ λ¬νλ€.// src/index.js
import { createStore } from "redux";
import rootReducer from "./modules";
import {Provider} from "react-redux";
const store = createStore(rootReducer);
ReactDOM.render(
<Provider store={store}>
<App/>
</Provider>
...
);
μ΄μ μ»΄ν¬λνΈμμ 리λμ€ μ€ν μ΄μ μ κ·Όνμ¬ μνλ μνλ₯Ό λ°μμ€κ³ μ‘μ
λ dispatch
νλλ‘ νλ€.
connect(mapStateToProps, mapDispatchToPros)(μ°λν μ»΄ν¬λνΈ)
mapStateToProps
props
λ‘ μ λ¬ν μ§ μ μνλ ν¨μmapDispatchToProps
dispatch
νλ ν¨μλ₯Ό λ§λ€μ΄μ μ»΄ν¬λνΈμprops
λ‘ μ λ¬νλ ν¨μdispatch
ν¨μλ₯Ό μΈμλ‘ λ°λλ€.mapStateToProps
μ mapDispatchToProps
κ° λ°ννλ κ°μ²΄ λ΄λΆμ κ°λ€μ μ λΆ μ»΄ν¬λνΈμ props
λ‘ μ λ¬λλ€.mapDispatchToProps
μ ν΄λΉνλ μΈμλ‘ ν¨μ ννκ° μλ μ‘μ
μμ± ν¨μλ‘ μ΄λ£¨μ΄μ§ κ°μ²΄ ννλ₯Ό μ λ¬ν΄λ λλ€.connect
ν¨μλ₯Ό νΈμΆνλ©΄ λ λ€λ₯Έ ν¨μκ° λ°νλκ³ μ΄ ν¨μμ μΈμλ‘ μ»΄ν¬λνΈλ₯Ό μ λ¬νλ©΄ 리λμ€μ μ°λλ μ»΄ν¬λνΈκ° λ°νλλ€.const result : any = useSelector(selector : Function, deps : any[])
useSelector
λ 리λμ€ μ€ν μ΄μ μλ μνλ₯Ό μ‘°νν λ μ¬μ©λλ€.useSelectror
λ μΈμλ‘ selector ν¨μμ deps λ°°μ΄μ λ°λλ€.const number = useSelector(state => state.counter.number, []);
useDispatch
λ₯Ό νΈμΆνλ©΄ μ€ν μ΄μ λ΄μ₯ν¨μ dispatch
λ₯Ό λ°ννλ€.const dispatch = useDispatch();
useStore
λ₯Ό μ΄μ©νμ¬ μ»΄ν¬λνΈ λ΄μμ μ§μ store
μ μ κ·Όν μ μλ€.const store = useStore();
store.dispatch({type: "ACTION"}):
store.getState();
connect
ν¨μλ₯Ό μ¬μ©νμ¬ μ»΄ν¬λνΈμ 리λμ€λ₯Ό μ°λνμ κ²½μ° λΆλͺ¨ μ»΄ν¬λνΈκ° 리λ λλ§λ λ ν΄λΉ μ»΄ν¬λνΈμ props
κ° λ°λμ§ μμλ€λ©΄ 리λ λλ§λμ§ μλλ€.Hook
μ μ¬μ©νμ λλ μ΄λ¬ν μ΅μ ν μμ
μ΄ μλμ μΌλ‘ μ΄λ£¨μ΄μ§μ§ μλλ€.React.memo()
λ₯Ό μ¬μ©νμ¬ μ΅μ ν μμ
μ ν΄μ€λ€.