
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μΈμ μΆκ° μ λ³΄κ° νμλ‘ ν λλ μ‘μ
μμ± ν¨μμ μΈμλ‘ μ λ¬νμ¬ ν΄λΉ μ 보λ₯Ό λ΄μ μ‘μ
κ°μ²΄λ₯Ό λ°ννλλ‘ νλ€.createActionpayloadλΌλ νλ‘νΌν°λ‘ μ μλλ€.payloadμ λ£λ κ²μ΄ μλλΌ λ³νμ μ£Όμ΄μ λ£κ³ μΆλ€λ©΄, λ λ²μ§Έ μΈμλ‘ payloadλ₯Ό μ μνλ ν¨μλ₯Ό μ λ¬νλ©΄ λλ€.handleActionsimmer λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ©΄ νΈλ¦¬νκ² λΆλ³μ±μ μ μ§νλ©° μνλ₯Ό μ
λ°μ΄νΈν μ μλ€.produceproduceν¨μκ° λΆλ³μ±μ μ§μΌμ£Όκ³ μλ‘μ΄ μνλ₯Ό λ°ννλ€.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)(μ°λν μ»΄ν¬λνΈ)
mapStateToPropspropsλ‘ μ λ¬ν μ§ μ μνλ ν¨μmapDispatchToPropsdispatchνλ ν¨μλ₯Ό λ§λ€μ΄μ μ»΄ν¬λνΈμ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()λ₯Ό μ¬μ©νμ¬ μ΅μ ν μμ
μ ν΄μ€λ€.