June 16, 2021
리λμ€λ μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬λ€. κΈ°μ‘΄ 리μ‘νΈ νλ‘μ νΈμμ A μ»΄ν¬λνΈκ° propsλ₯Ό ν΅ν΄ B,C,D,F μ»΄ν¬λνΈλ₯Ό κ±°μ³μ F μ»΄ν¬λνΈλ‘ stateλ₯Ό μ λ¬νλ 볡μ‘ν ꡬ쑰λ₯Ό μ§λ λ€λ©΄, 리λμ€λ μ€ν μ΄(store)λΌλ μν μ μ₯μλ₯Ό μ»΄ν¬λνΈ λ°κΉ₯(μ ν리μΌμ΄μ μμ)μ λμ΄μ, νλ‘μ νΈ μ μμμ κ°λ¨νκ² μνλ₯Ό κ΄λ¦¬ν μ μκ² ν΄μ€λ€. λ°λΌμ 리λμ€ μνκ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ 리μ‘νΈ νλ‘μ νΈμμλ A -> μ€ν μ΄ -> Fμ κ°μ μμΌλ‘, κ°λ¨νκ² μνλ₯Ό μ λ°μ΄νΈ ν μ μκ² λλ κ²μ΄λ€.
μ¬μ§ μΆμ² : https://www.tekportal.net/redux/
μ μ μν κ΄λ¦¬λ context APIλ‘λ ν΄κ²°ν μ μλ€. νμ§λ§ 리λμ€λ₯Ό μ¬μ©ν κ²½μ° μ½λμ μ μ§λ³΄μμ μΈ‘λ©΄κ³Ό μμ μ ν¨μ¨μ μΈ‘λ©΄μμ ν° μ΄μ μ λ릴 μ μλ€κ³ νλ€.
Reduxλ Reactμ μ’ μλ λΌμ΄λΈλ¬λ¦¬κ° μλμ΄μ Vanilla-JS + Redux, Vue + Reduxμ κ°μ λ€μν νμ©μ΄ κ°λ₯νλ€.
μ‘μ μ type μμ±κ°μ κ°μ§ μλ°μ€ν¬λ¦½νΈ κ°μ²΄λ€.
{
type: 'INCREASE'
}
μ‘μ μ βμνλ₯Ό γ γ νκ² λ³νμμΌλΌβλΌλ λͺ λ Ήκ³Όλ κ°λ€. dispatchλΌλ μΌμ’ μ νΈλ¦¬κ±°μ μ μ‘μ κ°μ²΄λ₯Ό λ΄μμ μ€ν μ΄μ μ λ¬νλκ²μ μνλ₯Ό INCREASE νλΌκ³ λͺ λ Ήνλ κ²κ³Ό κ°λ€.
{
type: 'ADD_TODO',
data: {
id: 1,
text: '리λμ€ λ°°μ°κΈ°'
}
}
{
type: 'INCREASE',
diff: 2
}
μ‘μ κ°μ²΄μ type νλλ νμμ μΌλ‘ μ λ ₯ν΄μΌ νλ€. type μ΄μΈμ νλλ₯Ό μ λ ₯ν΄μ μν λ³νμ μ°Έκ³ ν κ°λ€μ μ§μ ν΄μ€ μ μλ€. μλ₯Ό λ€μ΄, INCREASEμ diff κ°μ μ°Έκ³ ν΄μ 2μ© INCREASE νλ€λ κ°.
μ‘μ μμ±μλ μ‘μ κ°μ²΄λ₯Ό λ§λ€μ΄μ£Όλ ν¨μλ€.
function addTodo(data){
return {
type: 'ADD_TODO',
data
};
}
// νμ΄ν ν¨μ νν
// export ν€μλλ₯Ό λΆμ¬μ λ€λ₯Έ νμΌμμ μ‘μ
μμ±μλ₯Ό λΆλ¬μ μ¬μ©ν μ μλ€.
export const addTodo = data =>({
type: 'ADD_TODO',
data
});
μ‘μ
κ°μ²΄λ κ°κΈμ μ‘μ
μμ±μλ‘ λ§λλ κ²μ΄ μ’λ€. μΆνμ μ‘μ
κ°μ²΄μ ꡬ쑰λ₯Ό λ³κ²½ν μΌμ΄ μκΈΈ κ²½μ° λ±μ μ΄μ μ κ°μ Έλ€μ£ΌκΈ° λλ¬Έμ΄λ€. μ‘μ
μμ±μλ redux-actions
λΌμ΄λΈλ¬λ¦¬μ createAction
ν¨μλ₯Ό μ¬μ©νμ¬ λμ± κ°νΈνκ² λ§λ€ μ μλ€. (λ€μ κ²μκΈ μ°Έμ‘°)
리λμλ μ‘μ μ΄ λ°μνμ λ μλ‘μ΄ μν―κ°μ λ§λλ ν¨μλ€. 리λμλ νμ¬ μν(state)μ μ‘μ μ νλΌλ―Έν°λ‘ μ λ¬λ°λλ€. μ‘μ μ μκ±°ν μν λ³ν λ‘μ§μ μ μν΄λμ΄μλ, μ λ¬λ°μ μ‘μ λλ‘ μνλ₯Ό μ λ°μ΄νΈνμ¬ λ°ννλ ν¨μλ€.
const initialState = {
counter:1
};
// 리λμ€λ μ€ν μ΄λ₯Ό μμ±ν λ μν―κ°μ΄ μλ μνλ‘ λ¦¬λμλ₯Ό νΈμΆνλ―λ‘,
// 맀κ°λ³μμ κΈ°λ³Έκ°μ μ¬μ©ν΄μ μ΄κΈ° μν―κ°μ μ μνλ€.
function reducer(state = initialState, action){
switch(action.type){
case INCREMENT:
return{
counter: state.counter +1
};
default:
return state;
}
}
리λμλ λ§μ°¬κ°μ§λ‘ redux-actions
λΌμ΄λΈλ¬λ¦¬μ handleActions
ν¨μλ₯Ό μ¬μ©νμ¬ λμ± κ°νΈνκ² λ§λ€ μ μλ€.
μ€ν μ΄λ μ»΄ν¬λνΈ μΈλΆμμ 리λμ€μ μν―κ°μ κ°μ§λ κ°μ²΄λ€. μ€ν μ΄ μμλ νμ¬ μ ν리μΌμ΄μ
μν(state)μ 리λμκ° λ€μ΄κ° μλ€. μ€ν μ΄λ dispatch
, subscribe
, getState
μ κ°μ λ΄μ₯ν¨μλ₯Ό κ°λλ€.
import {createStore} from 'redux';
(...)
const store = createStore(reducer);
λμ€ν¨μΉλ μ€ν μ΄μ λ΄μ₯ ν¨μ μ€ νλλ‘, μ‘μ
μ λ°μμν€λ νΈλ¦¬κ±° μν μ 맑λλ€. dispatch(action)
κ³Ό κ°μ ννλ‘ νΈμΆνλ€.
ꡬλ μ μ€ν μ΄μ λ΄μ₯ ν¨μ μ€ νλλ‘, μ€ν μ΄μ μν μν μ λ°μ΄νΈκ° λ°μν λλ§λ€ ꡬλ μ μ§μ ν 리μ€λ ν¨μκ° νΈμΆλλ€. μν―κ° λ³κ²½ μ¬λΆλ₯Ό νμΈνκΈ° μν΄ μ°μΈλ€.
const listener= () => {
console.log('μνκ° μ
λ°μ΄νΈλ¨');
}
const unsubscribe = store.subscribe(listener);
unsubscribe(); // μΆν ꡬλ
μ λΉνμ±νν λ ν¨μλ₯Ό νΈμΆ
subscribeλ μμ κ°μ΄ μ§μ μ μΌλ‘ νΈμΆλ기보λ€λ react-redux
ν¨ν€μ§μμ μ 곡νλ connect()
ν¨μλ‘ λ체 μ¬μ©λλ νΈμ΄λ€.
μμ λ°°μ΄ κ°λ μ ν λλ‘ μ’ λ μμΈν 리λμ€ μλ ꡬ쑰λ₯Ό μμ보μ.
B μ»΄ν¬λνΈμμμ λ³νκ° G μ»΄ν¬λνΈμ λ°μλλ κ²½μ°λ₯Ό μκ°ν΄λ³΄μ.
subscribe(listener)
, μ΄ν μ€ν μ΄λ μνκ° μ
λ°μ΄νΈλ λλ§λ€ ν΄λΉ ν¨μλ₯Ό νΈμΆν΄μ£Όλ ꡬ쑰λ€.νλμ μ ν리μΌμ΄μ μ νλμ μ€ν μ΄λ§. μ ν리μΌμ΄μ λ΄ μ¬λ¬κ°μ μ€ν μ΄λ₯Ό λ μλ μμ§λ§ μν κ΄λ¦¬κ° 볡μ‘ν΄μ§ μ μμΌλ―λ‘ κΆμ₯νμ§ μμ.
리λμ€ μνλ μ½κΈ° μ μ©μ΄λ€. μν―κ°μ λΆλ³ κ°μ²΄λ‘ κ΄λ¦¬ν΄μΌ λ΄λΆμ μΌλ‘ λ°μ΄ν°κ° λ³κ²½λλ κ²μ κ°μ§ν μ μλ€.
μμ ν¨μλ λΆμ ν¨κ³Όλ₯Ό λ°μμν€μ§ μμμΌ νλ€. λν κ°μ μΈμμ νμ κ°μ κ°μ λ°νν΄μΌ νλ€. λ°λΌμ 리λμ λ΄λΆμμ λλ€ κ° μμ±, Date ν¨μ μ¬μ©, λ€νΈμν¬ μμ² λ±μ κΈμ§λλ€.
리λμ€ μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬λ₯Ό κ°λ μ€μ¬μΌλ‘ μ΄ν΄λ³΄μλ€. λ€μ κΈμμλ μ½λλ₯Ό μ€μ¬μΌλ‘ 리λμ€ νμ© μμλ₯Ό μ΄ν΄λ³΄λλ‘ νκ² λ€.
리λμ€λ 무μμ΄κ³ , μ μ¬μ©νλκ°?
리λμ€, μ μΈκΉ? μ½κ³ νΈνκ² μ¬μ©νκΈ° μν λ°μ
<리μ‘νΈλ₯Ό λ€λ£¨λ κΈ°μ κ°μ ν>(κΉλ―Όμ€, 2019)
<μ€μ 리μ‘νΈ νλ‘κ·Έλλ° κ°μ ν>(μ΄μ¬μΉ, 2020)