Reduxλ μ ν리μΌμ΄μ
μ λͺ¨λ μνλ₯Ό νλμ κ°μ²΄ νΈλ¦¬λ‘ λ§λ€κ³ , μ΄λ₯Ό νλμ storeμ μ μ₯ν©λλ€. μ¦, μνλ μ€μ μ§μ€μμΌλ‘ κ΄λ¦¬λ©λλ€.
const store = createStore(reducer);
Reduxμμλ μν(state)λ₯Ό μ§μ μμ νμ§ μμ΅λλ€. μ€μ§ actionμ ν΅ν΄μλ§ μνλ₯Ό λ³κ²½ν μ μμΌλ©°, μ€μ λ³κ²½μ reducerμμ μ²λ¦¬ν©λλ€.
reducerλ μ΄μ μνμ actionμ μ
λ ₯λ°μ μλ‘μ΄ μνλ₯Ό λ°ννλ μμ ν¨μμ
λλ€.
function reducer(state, action) {
switch(action.type) {
case 'INCREMENT':
return { count: state.count + 1 };
default:
return state;
}
}
createStore()λ‘ μμ±νλ©°, νμ¬ μν(state), reducer, dispatch κΈ°λ₯μ ν¬ν¨ν©λλ€.type (λ³κ²½μ μ’
λ₯λ₯Ό λνλ)payload (λ°μ΄ν° μ λ¬μ©)const incrementAction = {
type: 'INCREMENT',
payload: 1 // μ νμ
};
// λ²νΌ ν΄λ¦ μ΄λ²€νΈ β μ‘μ
μμ± β λμ€ν¨μΉ
<button onClick={() => dispatch({ type: 'INCREMENT' })}>+</button>
store.dispatch(action) ννλ‘ μ¬μ©.dispatch({ type: 'INCREMENT' });
const initialState = { count: 0 };
function counterReducer(state = initialState, action) {
switch(action.type) {
case 'INCREMENT':
return { count: state.count + 1 };
case 'DECREMENT':
return { count: state.count - 1 };
default:
return state;
}
}
redux-thunk, redux-saga (λΉλκΈ° μ²λ¦¬μ μμ£Ό μ¬μ©)// 1. μ‘μ
μμ±μ
const increment = () => ({ type: 'INCREMENT' });
// 2. 리λμ
function counter(state = { count: 0 }, action) {
switch (action.type) {
case 'INCREMENT':
return { count: state.count + 1 };
default:
return state;
}
}
// 3. μ€ν μ΄ μμ±
const store = createStore(counter);
// 4. λμ€ν¨μΉ (μ: λ²νΌ ν΄λ¦ μ)
store.dispatch(increment());
| μ©μ΄ | μ€λͺ |
|---|---|
| Store | μ ν리μΌμ΄μ μ μ 체 μνλ₯Ό 보κ΄νλ μ μ₯μ |
| Action | μν λ³κ²½ μμ²μ λνλ΄λ κ°μ²΄ |
| Event | μ¬μ©μμ μ λ ₯μ΄λ μΈλΆ μκ·Ή, μ‘μ μ λ°μμν€λ νΈλ¦¬κ±° |
| Dispatch | μ‘μ μ μ€ν μ΄μ 보λ΄λ ν¨μ |
| Reducer | μ‘μ μ μ²λ¦¬ν΄ μ μνλ₯Ό λ°ννλ μμ ν¨μ |