-
Notifications
You must be signed in to change notification settings - Fork 5
Redux
μ₯μ
- μ»΄ν¬λνΈ μ½λλ‘ λΆν° μν κ΄λ¦¬ μ½λλ₯Ό λΆλ¦¬ν μ μλ€.
- μλ² λ λλ§ μ λ°μ΄ν° μ λ¬μ΄ κ°νΈνλ€.
- λ‘컬 μ€ν 리μ§μ λ°μ΄ν°λ₯Ό μ μ₯νκ³ λΆλ¬μ€λ μ½λλ₯Ό μ½κ² μμ±ν μ μλ€.
- κ°μ μν―κ°μ λ€μμ μ»΄ν¬λνΈμμ νμλ‘ ν λ μ’λ€.
- λΆλͺ¨ μ»΄ν¬λνΈμμ κΉμ κ³³μμ μλ μμ μ»΄ν¬λνΈμ μν―κ°μ μ λ¬ ν λ μ’λ€
- μλ¦Όμ°½κ³Ό κ°μ μ μ μ»΄ν¬λνΈμ μν―κ°μ κ΄λ¦¬ν λ μ’λ€.
- νμ΄μ§κ° μ νλμ΄λ λ°μ΄ν°λ μ΄μ μμ΄μΌ ν λ μ’λ€.
μμΉ
- μ 체 μν―κ°μ νλμ κ°μ²΄μ μ μ₯νλ€
- μν―κ°μ λΆλ³ κ°μ²΄λ€
- μν―κ°μ μμ ν¨μμ μν΄μλ§ λ³κ²½λμ΄μΌ νλ€.
ꡬμ±
- μ‘μ
- λ―Έλ€μ¨μ΄
- 리λμ
- μ€ν μ΄
- type μμ±κ°μ κ°μ§ js κ°μ²΄.
- action κ°μ²΄λ₯Ό dispatch λ©μλμ λ£μ΄μ νΈμΆνλ©΄ 리λμ€λ μν―κ°μ λ³κ²½νκΈ° μν΄ μ κ·Έλ¦Ό μ²λΌ μννλ€.
store.dispatch({ type: 'ADD', title: 'νμ΄ν μΆκ°ν λ΄μ©', priority:'high'})- 리λμκ° μ‘μ μ μ²λ¦¬νκΈ° μ μ μ€νλλ ν¨μλ€.
- λλ²κΉ λͺ©μ μΌλ‘ μν―κ° λ³κ²½ μ λ‘κ·Έλ₯Ό μΆλ ₯νκ±°λ, 리λμμμ λ°μν μμΈλ₯Ό μλ²λ‘ μ μ‘νλ λ±μ λͺ©μ μΌλ‘ νμ© νλ€.
const middleware = store => next => action => next(action)- 리λμ€μ μν―κ°μ κ°μ§λ κ°μ²΄λ€.
- μ‘μ μ λ°μμ μ€ν μ΄μ dispatch λ©μλλ‘ μμλλ€
- μ€ν μ΄λ μ‘μ μ΄ λ°μνλ©΄ λ―Έλ€μ¨μ΄ ν¨μλ₯Ό μ€ννκ³ , 리λμλ₯Ό μ€νν΄μ μν―κ°μ μλ‘μ΄ κ°μΌλ‘ λ³κ²½νλ€.
const INITIAL_STATE = { value: 0};
const reducer = createReducer(INITIAL_STATE, {
INCREMENT: state => (state.value +=1),
});
const store = createStore(reducer);- 리λμ μμμ λΉλκΈ°λ₯Ό νκ² λλ©΄ 3λ² μμΉμΈ 'μν―κ°μ μμ ν¨μμ μν΄μλ§ λ³κ²½λμ΄μΌ νλ€.' μλ°°λλ€. κ·Έλμ middlewareμμ μ²λ¦¬ νλλ° μ΄λ ν¨ν€μ§λ₯Ό μ΄λ€.
- redux-thunk, redux-observable, redux-saga
μΆμ²: μ€μ 리μ‘νΈ νλ‘κ·Έλλ°, μ΄μ¬μΉ, μΈμ¬μ΄νΈ(2020), pg 249~308
- 리μ‘νΈ μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬
- μ»΄ν¬λνΈμ μν μ λ°μ΄νΈ κ΄λ ¨ λ‘μ§μ λ€λ₯Έ νμΌλ‘ λΆλ¦¬μμΌ ν¨μ¨μ μΈ κ΄λ¦¬ κ°λ₯
- μ μ μνλ₯Ό κ΄λ¦¬ν λ ν¨κ³Όμ (Context APIλ₯Ό ν΅ν΄μλ κ°λ₯)
- νλ‘μ νΈμ κ·λͺ¨κ° ν΄ κ²½μ° λ¦¬λμ€ > Context API
-
μ½λμ μ μ§ λ³΄μμ± λμ¬μ£Όκ³ μμ ν¨μ¨μ κ·Ήλνν΄μ£ΌκΈ° λλ¬Έ
ex) TODO
-
-
μνμ μ΄λ ν λ³νκ° νμνλ©΄ μ‘μ (action)μ΄ λ°μ
-
νλμ κ°μ²΄λ‘ ννλλ€
-
νμ
{ type: 'ADD_TODO' }
-
μ‘μ κ°μ²΄λ type νλλ₯Ό λ°λμ κ°μ§λ€
- type β μ‘μ μ μ΄λ¦μ΄λΌκ³ μκ°νλ©΄ λλ€
- ex)
{ type: 'ADD_TODO', data: { id: 1, text: '곡λΆνκΈ°' } } { type: 'CHANGE_INPUT', text: 'μλ νμΈμ' }
- μ‘μ κ°μ²΄λ₯Ό λ§λ€μ΄ μ£Όλ ν¨μ
const addTodo = (data) => ({
type: 'ADD_TODO',
data
}) - λ³νλ₯Ό μΌμΌμΌμΌ ν λ, μ§μ μ‘μ κ°μ²΄λ₯Ό λ§λ€κΈ°λ³΄λ€ ν¨μλ‘ λ§λ€μ΄μ κ΄λ¦¬
- λ³νλ₯Ό μΌμΌν€λ ν¨μ
- μ‘μ μ λ§λ€μ΄μ λ°μμν€λ©΄ 리λμκ° νμ¬ μνμ μ λ¬λ°μ μ‘μ κ°μ²΄λ₯Ό μΈμλ‘ λ°μ μ΄
- μΈμλ‘ λμ΄μ¨ λ κ°μ μ°Έκ³ νμ¬ μλ‘μ΄ μνλ₯Ό λ§λ€μ΄μ λ°ν
const initialState = {
counter: 1
};
const reducer(state = initialState, action) {
switch(action.type) {
case INCREMENT:
return {
counter: state.counter + 1
};
default:
return state;
}
}- ν κ°μ νλ‘μ νΈλ λ¨ νλμ μ€ν μ΄λ₯Ό κ°μ§λ€
- μ€ν μ΄ μμλ νμ¬ μ ν리μΌμ΄μ
μν&리λμ+ λͺ κ°μ§ μ€μνλ΄μ₯ ν¨μ- μ€ν μ΄μ λ΄μ₯ν¨μ
- λμ€ν¨μΉ(dispatch)
- μ‘μ μ λ°μμν€λ κ²
dispatch(action)- λμ€ν¨μΉ νΈμΆ β μ€ν μ΄λ 리λμ ν¨μλ₯Ό μ€νμμΌμ μλ‘μ΄ μν λ§λ λ€
- ꡬλ
(subscribe)
- 리μ€λ ν¨μλ₯Ό νλΌλ―Έν°λ‘ λ£μ΄μ νΈμΆν΄μ£Όλ©΄, 리μ€λ ν¨μκ° μ‘μ μ΄ λμ€ν¨μΉ λ λ (μνκ° μ λ°μ΄νΈ λ λ) νΈμΆλλ€.
- λμ€ν¨μΉ(dispatch)
- μ€ν μ΄μ λ΄μ₯ν¨μ
- λ¨μΌ μ€ν μ΄
- 1 app = 1 store
- λ€μ€ μ€ν μ΄κ° λΆκ°λ₯νμ§λ μλ€
- μν κ΄λ¦¬κ° 볡μ‘ν΄μ§ μ μμΌλ―λ‘ κΆμ₯ X
- μ½κΈ° μ μ© μν
- μνλ₯Ό μ λ°μ΄νΈ ν λ κΈ°μ‘΄μ κ°μ²΄ 건λλ¦¬μ§ μκ³ μλ‘μ΄ κ°μ²΄ μμ±
- λΆλ³μ± μ§μΌμ£ΌκΈ° μν΄ spread μ°μ°μ or immerμ κ°μ λΆλ³μ± λΌμ΄λΈλ¬λ¦¬ μ¬μ©
- 리λμ€μμλ λ΄λΆμ μΌλ‘ λ°μ΄ν°κ° λ³κ²½λλ κ²μ κ°μ§νκΈ° μν΄ μμ λΉκ΅κ²μ¬λ₯Ό νλ€
- 리λμλ μμν ν¨μ
- λ³νλ₯Ό μΌμΌν€λ 리λμ ν¨μλ μμ ν¨μμ¬μΌ νλ€.
- 리λμ ν¨μλ μ΄μ μνμ μ‘μ κ°μ²΄λ₯Ό μΈμλ‘ λ°λλ€
- νλΌλ―Έν° μΈμ κ°μ μμ‘΄νλ©΄ μλλ€
- μ΄μ μνλ 건λλ¦¬μ§ μκ³ , λ³νλ₯Ό μ€ μλ‘μ΄ μν κ°μ²΄λ₯Ό λ§λ€μ΄ λ°ννλ€
- λκ°μ νλΌλ―Έν°λ‘ νΈμΆλ 리λμ ν¨μλ κ°μ κ²°κ³Ό κ°μ λ°νν΄μΌ νλ€
- 리λμ ν¨μ λ΄λΆμμ λλ€κ° λ§λ€κΈ°, Date ν¨μ μ¬μ©νκΈ°, λ€νΈμν¬ μμ²νκΈ° X
- λ³νλ₯Ό μΌμΌν€λ 리λμ ν¨μλ μμ ν¨μμ¬μΌ νλ€.
리μ‘νΈ νλ‘μ νΈμμ 리λμ€λ₯Ό μ¬μ©ν λ κ°μ₯ λ§μ΄ μ¬μ©νλ ν¨ν΄μ νλ μ ν
μ΄μ
λ μ»΄ν¬λνΈμ 컨ν
μ΄λ μ»΄ν¬λνΈλ₯Ό λΆλ¦¬νλ κ².
- νλ μ ν
μ΄μ
λ μ»΄ν¬λνΈ
- μν κ΄λ¦¬ X
- propsλ₯Ό λ°μμμ νλ©΄μ UIλ₯Ό 보μ¬μ£ΌκΈ°λ§ νλ μ»΄ν¬λνΈ
- 컨ν
μ΄λ μ»΄ν¬λνΈ
- 리λμ€μ μ°λλμ΄ μλ μ»΄ν¬λνΈλ‘
- 리λμ€λ‘λΆν° μνλ₯Ό λ°μμ€κΈ°λ, 리λμ€ μ€ν μ΄μ μ‘μ μ λμ€ν¨μΉ νκΈ°λ νλ€.
μ₯μ
- μ½λμ μ¬μ¬μ©μ±
- κ΄μ¬μ¬μ λΆλ¦¬κ° μ΄λ£¨μ΄μ Έ UIλ₯Ό μμ±ν λ μ’ λ μ§μ€ν μ μλ€.

- UIμ κ΄λ ¨λ νλ μ ν μ΄μ λ μ»΄ν¬λνΈ β src/components
- 리λμ€μ μ°λλ 컨ν μ΄λ μ»΄ν¬λνΈ β src/containers
- Redux κ°λ°μ λꡬ
- ν¬λ‘¬ νμ₯ νλ‘κ·Έλ¨μΌλ‘ μ€μΉνμ μ¬μ©κ°λ₯
- ν¨ν€μ§λ₯Ό μ€μΉνμ¬ μ μ©νλ κ² μΆμ²
- yarn add redux-devtools-extension
import React from "react";
import ReactDOM from "react-dom";
import { createStore } from "redux";
import { Provider } from "react-redux";
import { composeWithDevTools } from "redux-devtools-extension";
import App from "./App";
import rootReducer from "./modules";
const store = createStore(rootReducer, composeWithDevTools());
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById("root")
);
μΆμ²: 리μ‘νΈλ₯Ό λ€λ£¨λ κΈ°μ (velopertλ)
- μ μ(κΈλ‘λ²) μνκ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬
- μ€ν μ΄λΌλ κ°μ곡κ°μ λ°μ΄ν°λ₯Ό λͺ¨μλμ΄,
νμν μ»΄ν¬λνΈμμ λ°μ΄ν°λ₯Ό κ°μ Έλ€ μ¬μ©, λ³κ²½ ν μ μμ -
Context APIμuseReducer Hookμ μ¬μ©ν΄μ κ°λ°νλ νλ¦κ³Ό
Redux(리λμ€)λ₯Ό μ¬μ©νλ κ°λ° λ°©μμ΄ μ μ¬- Reduxλ
리λμμμ‘μ μ΄λΌλ κ°λ μ μ¬μ©
- Reduxλ
-
[μ μ¬μ ] Reduxλ‘ μν κ΄λ¦¬ μ β‘
useReducerμμ μ°μλ 리λμ ν¨μλ₯Ό μ¬μ© -
[μ°¨μ΄μ ] Reduxλ
λ―Έλ€μ¨μ΄(Middleware)λΌλ κ°λ μ΄ μ‘΄μ¬ -
[μ°¨μ΄μ ] λ―Έλ€μ¨μ΄λ₯Ό μ¬μ©νλ©΄ μ‘μ κ°μ²΄κ° 리λμμμ μ²λ¦¬λκΈ° μ μ
μ°λ¦¬κ° μνλ μμ λ€μ μν ν μ μμ- νΉμ 쑰건μ λ°λΌ β‘ μ‘μ μ΄ λ¬΄μλκ² λ§λ€ μ μμ΅λλ€. - μ‘μ μ μ½μμ μΆλ ₯νκ±°λ, μλ²μͺ½μ λ‘κΉ μ ν μ μμ΅λλ€. - μ‘μ μ΄ λμ€ν¨μΉ λμ λ β‘ μ΄λ₯Ό μμ ν΄μ 리λμμκ² μ λ¬λλλ‘ ν μ μμ΅λλ€. - νΉμ μ‘μ μ΄ λ°μνμ λ β‘ μ΄μ κΈ°λ°νμ¬ λ€λ₯Έ μ‘μ μ΄ λ°μλλλ‘ ν μ μμ΅λλ€. - νΉμ μ‘μ μ΄ λ°μνμ λ β‘ νΉμ μλ°μ€ν¬λ¦½νΈ ν¨μλ₯Ό μ€νμν¬ μ μμ΅λλ€.
-
[μ°¨μ΄μ & λ―Έλ€μ¨μ΄ νΉμ§] λ―Έλ€μ¨μ΄λ μ£Όλ‘
λΉλκΈ° μμμ μ²λ¦¬ ν λ λ§μ΄ μ¬μ©λ©λλ€.
-
connectν¨μ- 리λμ€μ μν λλ μ‘μ μμ± ν¨μλ₯Ό μ»΄ν¬λνΈμ props λ‘ λ°μμ¬ μ μμ
- 컨ν μ΄λ μ»΄ν¬λνΈλ₯Ό λ§λλ λ λ€λ₯Έ λ°©λ²
- μ΄ ν¨μλ μ¬μ€ μμΌλ‘ μ¬μ© ν μΌμ΄ λ³λ‘ μλ€. ββ
-
useSelector,useDispatchκ° λ μμ£Ό μ°μ
-
-
useSelector,useDispatch,useStoreμ κ°μ Hooks- μμ½κ² μνλ₯Ό μ‘°ννκ±°λ μ‘μ
μ λμ€ν¨μΉ ν μ μμ
- μμ½κ² μνλ₯Ό μ‘°ννκ±°λ μ‘μ
μ λμ€ν¨μΉ ν μ μμ
-
[μ°¨μ΄μ ]
connectν¨μμuseSelectorν¨μμλ
λ΄λΆμ μΌλ‘ μ΅μ νκ° μ μ΄λ£¨μ΄μ Έμμ΄μ
μ€μ μνκ° λ°λλλ§ μ»΄ν¬λνΈκ° 리λ λλ§ λ¨ -
[μ°¨μ΄μ ] Context APIλ₯Ό μ¬μ©ν λμλ
κ·Έλ¬ν μ΅μ νκ° μλμΌλ‘ μ΄λ£¨μ΄μ Έμμ§ μκΈ° λλ¬Έμ
Context κ° μ§λκ³ μλ μνκ° λ°λλ©΄
ν΄λΉ Context μ Provider λ΄λΆ μ»΄ν¬λνΈλ€μ΄ λͺ¨λ 리λ λλ§ λ¨
- Yes: 리λμ€
- No: Context API
- Yes: 리λμ€
- No: Context API
- 무μ¨μΌμ΄ μΌμ΄λ¬λμ§ μ€λͺ νλ μλ°μ€ν¬λ¦½νΈ κ°μ²΄
- μ‘μ
κ°μ²΄λ
typeνλλ₯Ό νμμ μΌλ‘ κ°μ§κ³ μμ΄μΌ ν¨ - κ·Έ μΈλ κ°λ°μ λ§μ >.<
{
type: "TOGGLE_VALUE"
}-
actionTypes.jsλ‘ λ€μ΄λ°μ μμ£Όνλ€. - μ‘μ λͺ μ λλ¬Έμλ‘ μμ±νλ€.
// μ‘μ
μ μ : .../actionTypes.js
// μ‘μ
λͺ
μ λλ¬Έμλ‘ μ
λ ₯
export const ADD_TODO = 'ADD_TODO'
export const TOGGLE_TODO = 'TOGGLE_TODO'
export const SET_VISIBILITY_FILTER = 'SET_VISIBILITY_FILTER'
{
type : ADD_TODO,
text : 'build my first Redux app',
index : 33, // κ³ μ μΈλ±μ€λ₯Ό μ¬μ©νκΈ°λν¨.
}
// μ‘μ
μ μ¬μ©ν κ³³
import { ADD_TODO, TOGGLE_TODO, SET_VISIBILITY_FILTER } from 'κ²½λ‘/actionTypes'- μ‘μ μ λ§λλ ν¨μ (ν νλ¦Ώ λλμ΄λΌκ³ μκ°μ΄ λ€μλ€!!!)
- λ¨μν νλΌλ―Έν°λ₯Ό λ°μμμ μ‘μ κ°μ²΄ ννλ‘ λ§λ€μ΄μ€λ€.
- μ‘μ
μμ±ν¨μλ₯Ό λ§λ€μ΄μ μ¬μ©νλ μ΄μ :
- λμ€μ μ»΄ν¬λνΈμμ λμ± μ½κ² μ‘μ μ λ°μμν€κΈ° μν¨
- κ·Έλμ λ³΄ν΅ ν¨μ μμ
exportν€μλλ₯Ό λΆμ¬μ λ€λ₯Έ νμΌμμ λΆλ¬μμ μ¬μ©
- 리λμ€λ₯Ό μ¬μ© ν λ μ‘μ
μμ±ν¨μλ₯Ό μ¬μ©νλκ²μ΄ νμμ μ΄μ§ μμ
- μ‘μ μ λ°μ μν¬ λλ§λ€ μ§μ μ‘μ κ°μ²΄λ₯Ό μμ±ν μλ μμ
export function addTodo(data) { <-- `export` ν€μλ
return {
type: "ADD_TODO",
data
};
}
// νμ΄ν ν¨μλ‘λ λ§λ€ μ μμ΅λλ€.
export const changeInput = text => ({
type: "CHANGE_INPUT",
text
});-
λ³νλ₯Ό μΌμΌν€λ ν¨μ
-
μ‘μ (μ΄λ¦ν)μ λν리λμ(ν¨μ)λ₯Ό μ€ννμ¬ μνλ₯Ό λ³κ²½νλ€. -
λκ°μ§μ νλΌλ―Έν°λ₯Ό λ°μμ¨λ€.
-
νμ¬μ μνμ,μ‘μ
function reducer(state, action) { <-- νμ¬ μν & μ‘μ μ λ°μ μ΄!! // μν μ λ°μ΄νΈ λ‘μ§ return alteredState; }
-
-
리λμλ, νμ¬μ μνμ, μ λ¬ λ°μ μ‘μ μ μ°Έκ³ νμ¬ μλ‘μ΄ μνλ₯Ό λ§λ€μ΄μ λ°ννλ€.
-
μ΄ λ¦¬λμλ useReducer λ₯Ό μ¬μ©ν λ μμ±νλ 리λμμ λκ°μ ννλ₯Ό κ°μ§κ³ μλ€!
import * from './headerTypes' // ν΄λμ»΄ν¬λνΈ μ‘μ
νμ
λͺ¨λ λΆλ¬μ€κΈ°
const initState = { // stateμ μ΄κΈ°ν μ€μ
state01 : {},
state02 : "",
state03 : true,
stateData : [],
...
}
// ν΄λ μ»΄ν¬λνΈμ© 리λμ μ μ, κ°κ°μ μ»΄ν¬λνΈλ³ 리λμ, μ‘μ
, μ‘μ
ν¬λ¦¬μμ΄ν°λ₯Ό κ°κ° μμ±νμ¬ RootReducer.jsμμ ν΅ν©νμ¬ storeμ μ μ©νλ€.
const headerReducer = (state = initState, action) => {
switch (action.type) {
case ADD_TODO :
return {
// κΈ°μ‘΄ stateλ₯Ό λ³κ²½νμ§ μκΈ°μν΄ μ κ°μ°μ°μ
//or object.assign()μ¬μ©νμ¬ λ³΅μ¬λ³Έμμ±
...state,
addTodo : action.payload.addTodo
}
case <μ‘μ
νμ
λͺ
> :
return {
...state, // λμ state
// μ‘μ
ν¬λ¦¬μμ΄ν°ν¨μ = action μ리μ μ€λ©°, μΈμλ‘λ°μ stateκ°μ΄ μ μ©
<statedμ΄λ¦> : action.payload.<stateμ΄λ¦>
}
// κΈ°λ³Έκ° κΌ μ§μ ν΄μ£ΌκΈ°
default :
return state
}
}- λ°μ΄ν°κ° μ μ₯λλ κ°μ곡κ°
-
store.jsνμΌμ λ§λ€μ΄ μ€ν μ΄λ₯Ό λ°λ‘ κ΄λ¦¬νλ κ²μ΄ μ’λ€.
-
-
createStore(<루νΈλ¦¬λμ>,<μν μ΄κΈ°κ° μ§μ >,<λ―Έλ€μ¨μ΄λ€>)λ₯Ό ν΅ν΄ μ€ν μ΄ μμ± - [μ°¨μ΄μ ] 리λμ€μμλ ν μ ν리μΌμ΄μ
λΉ νλμ μ€ν μ΄λ₯Ό λ§λ€κ² λλ€.
- Context API feature λ³λ‘ λ§λ€μμμ!
- μ€ν μ΄ μμλ,
νμ¬μ μ± μνμ, 리λμκ° λ€μ΄κ°μκ³ , μΆκ°μ μΌλ‘ λͺκ°μ§ λ΄μ₯ ν¨μλ€μ΄ μλ€.
// μ€ν μ΄μμ±κΈ°, λ―Έλ€μ¨μ΄μ μ© λͺ¨λ μν¬νΈ
import { createStore, applyMiddleware } from 'redux';
// μ¬κΈ°μ λΆν° λ―Έλ€μ¨μ΄/λ°λΈν΄ κ΄λ ¨ μν¬νΈ
import { composeWithDevTools } from 'redux-devtools-extension';
import logger from 'redux-logger';
import thunk from 'redux-thunk';
// λ£¨νΈ λ¦¬λμ μν¬νΈ
import rootReducer from './rootReducer';
// μ€ν μ΄ μμ±
const store = createStore(
rootReducer, // 리λμ μ°κ²°
initState, // μν μ΄κΈ°κ°
composeWithDevTools(applyMiddleware(thunk, logger))
// μ¬μ©ν λ°λΈν΄/λ―Έλ€μ¨μ΄ μ°κ²°
)- μ€ν μ΄μ λ΄μ₯ν¨μ μ€ νλ
- μ‘μ μ λ°μ μν€λ κ²
- dispatch λΌλ ν¨μμλ μ‘μ
μ νλΌλ―Έν°λ‘ μ λ¬
dispatch(action)
- μ€ν μ΄λ 리λμ ν¨μλ₯Ό μ€νμμΌμ
ν΄λΉ μ‘μ μ μ²λ¦¬νλ λ‘μ§μ΄ μλ€λ©΄ μ‘μ μ μ°Έκ³ νμ¬ μλ‘μ΄ μνλ₯Ό λ§λ€μ΄ μ€λ€.
- μ€ν μ΄μ λ΄μ₯ν¨μ μ€ νλ
- ν¨μ ννμ κ°μ νλΌλ―Έν°λ‘ λ°μμ¨λ€.
- dispatch λΌλ ν¨μμλ μ‘μ μ νλΌλ―Έν°λ‘ μ λ¬
- subscribe ν¨μμ νΉμ ν¨μλ₯Ό μ λ¬ν΄μ£Όλ©΄,
μ‘μ μ΄ λμ€ν¨μΉ λμμ λ λ§λ€ β‘ μ λ¬ν΄μ€ ν¨μκ° νΈμΆ - 리λμ€λ₯Ό μ¬μ©νκ² λ λ λ³΄ν΅ μ΄ ν¨μλ₯Ό μ§μ μ¬μ©νλ μΌμ λ³λ‘ μλ€! ββ
- λμ μ react-redux λΌλ λΌμ΄λΈλ¬λ¦¬μμ μ 곡νλ
connectν¨μ λλ
useSelector Hookμ μ¬μ©νμ¬ λ¦¬λμ€ μ€ν μ΄μ μνμ ꡬλ νλ€.
- react-reduxλ reduxμ react μ»΄ν¬λνΈλ₯Ό μ°λνμ¬ storeμ μ μ₯λ μνλ₯Ό propsλ‘ μ λ¬νλλ‘ λμμ€λ€.
- μ΄λ κ³³μ reduxλ§ μ€μΉν΄λ λλ€κ³ νλλ°.. νμ€ν μ λͺ¨λ₯΄κ² λ€..!
npm install --save redux
npm install --save react-redux- ν΄λ ꡬ쑰
- components : μ»΄ν¬λνΈλ€, νλ©΄μ 보μ¬μ§λ μ λ€
- modules : μ‘μ , 리λμ μ μ₯
