redux-tutorial/05_combine reducers

πŸ‘‰ https://github.com/happypoulp/redux-tutorial/wiki

Tutorial 05 - combine reducers

reducer κ°€ 뭔지 μ΄ν•΄ν•˜κΈ° μ‹œμž‘ν–ˆλ‹€β€¦

var reducer_0 = function (state = {}, action) {
    console.log('reducer_0 이 전달받은 μƒνƒœ', state, '와 μ•‘μ…˜', action)

    switch (action.type) {
        case 'SAY_SOMETHING':
            return {
                ...state,
                message: action.value
            }
        default:
            return state;
    }
}

… 그런데 더 λ‚˜μ•„κ°€κΈ°μ „μ—, λ§Œμ•½ μ—„μ²­ λ§Žμ€ μ•‘μ…˜λ“€μ΄ μžˆλ‹€λ©΄ reducer듀이 μ–΄λ–»κ²Œ 받을 지 κ³ λ―Όν•΄λ΄μ•Όν•œλ‹€:

var reducer_1 = function (state = {}, action) {
    console.log('reducer_0 이 전달받은 μƒνƒœ', state, '와 μ•‘μ…˜', action)

    switch (action.type) {
        case 'SAY_SOMETHING':
            return {
                ...state,
                message: action.value
            }
        case 'DO_SOMETHING':
            // ...
        case 'LEARN_SOMETHING':
            // ...
        case 'HEAR_SOMETHING':
            // ...
        case 'GO_SOMEWHERE':
            // ...
        // etc.
        default:
            return state;
    }
}

μ΄λ ‡κ²ŒλŠ” 단 ν•˜λ‚˜μ˜ reducer ν•¨μˆ˜κ°€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λͺ¨λ“  μ•‘μ…˜λ“€μ„ λ‹€λ£° 수 μ—†λ‹€ (ν•  μˆ˜λŠ” μžˆκ² μ§€λ§Œ, μ΄λŒ€λ‘œ μœ μ§€ν•  순 없닀…).

λ‹€ν–‰νžˆ ReduxλŠ” reducer κ°€ ν•˜λ‚˜μΈμ§€ μ—¬λŸ¬κ°œμΈμ§€ μ‹ κ²½μ“°μ§€μ•Šκ³ , λ§Žμ„ 땐 그것듀을 ν•©μΉ  수 있게 도와쀀닀.

reducer 2개λ₯Ό μ„ μ–Έν•΄λ³΄μž.

var userReducer = function (state = {}, action) {
    console.log('userReducer 이 전달받은 μƒνƒœ', state, '와 μ•‘μ…˜', action)

    switch (action.type) {
        // etc.
        default:
            return state;
    }
}
var itemsReducer = function (state = [], action) {
    console.log('itemsReducer 이 전달받은 μƒνƒœ', state, '와 μ•‘μ…˜', action)

    switch (action.type) {
        // etc.
        default:
            return state;
    }
}

각 λ¦¬λ“€μ„œμ— μ£Όμž…λœ 초기 μƒνƒœκ°’μ„ 잘 보면: userReducerλŠ” κ°μ²΄λ¦¬ν„°λŸ΄({})의 ν˜•νƒœμΈ 반면 itemsReducer λŠ” 초기 μƒνƒœκ°’μœΌλ‘œ λ°°μ—΄([]) 을 λ°›μ•˜λ‹€. 이것은 λ‹¨μˆœνžˆ λ¦¬λ“€μ„œλŠ” μ–΄λ–€ νƒ€μž…μ˜ 데이터 ꡬ쑰도 받을 수 μžˆλ‹€λŠ” 것을 보여주기 μœ„ν•¨μ΄λ‹€. μ–΄λ–€ 데이터 ꡬ쑰λ₯Ό 선택할 μ§€λŠ” κ·Έλ•Œ κ·Έλ•Œ λ‹€λ₯΄λ‹€ (객체, λ°°μ—΄, boolean, string, immutable structre, …).

μ΄λŸ°μ‹μœΌλ‘œ μ—¬λŸ¬κ°œμ˜ redcuer μ ‘κ·Ό λ°©μ‹μœΌλ‘œ 각 reducerκ°€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μƒνƒœμ˜ μΌλΆ€λ§Œμ„ λ‹€λ£¨κ²Œλœλ‹€.

ν•˜μ§€λ§Œ μ•Œλ‹€μ‹œν”Ό, createStoreλŠ” 였직 ν•˜λ‚˜μ˜ reducer ν•¨μˆ˜λ₯Ό λ°›λŠ”λ‹€.

μ–΄λ–»κ²Œ reducer 듀을 ν•©μΉ  수 μžˆμ„κΉŒ? 그리고 μ–΄λ–»κ²Œν•˜λ©΄ Reduxκ°€ 각 reducer듀을 μƒνƒœμ˜ μΌλΆ€λ§Œ λ‹€λ£¨κ²Œ ν•  수 μžˆμ„κΉŒ? κ°„λ‹¨ν•˜λ‹€. Redux의 combineReducers ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€. combineReducersλŠ” ν•΄μ‹œλ₯Ό 가지고 ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜κ³ , μ‹€ν–‰ν•  λ•Œ λͺ¨λ“  reducer듀을 ν˜ΈμΆœν•˜κ³ , μƒˆλ‘œμš΄ μƒνƒœ 쑰각듀을 Reduxκ°€ κ°–κ³ μžˆλŠ” ν•˜λ‚˜μ˜ μƒνƒœ 객체(λ‹¨μˆœν•œ ν•΄μ‹œ {})둜 μ‘°ν•©ν•œλ‹€. μ–˜κΈ°κ°€ κΈΈμ—ˆλŠ”λ° μ΄λŸ°μ‹μœΌλ‘œ reducer κ°€ μ—¬λŸ¬κ°œμΌ λ•Œ Redux μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“ λ‹€:

import { createStore, combineReducers } from 'redux'

var reducer = combineReducers({
    user: userReducer,
    items: itemsReducer
})
// Output:
// userReducer 이 전달받은 μƒνƒœ {} 와 μ•‘μ…˜ { type: '@@redux/INIT' }
// userReducer 이 전달받은 μƒνƒœ {} 와 μ•‘μ…˜ { type: '@@redux/PROBE_UNKNOWN_ACTION_9.r.k.r.i.c.n.m.i' }
// itemsReducer 이 전달받은 μƒνƒœ [] 와 μ•‘μ…˜ { type: '@@redux/INIT' }
// itemsReducer 이 전달받은 μƒνƒœ [] 와 μ•‘μ…˜ { type: '@@redux/PROBE_UNKNOWN_ACTION_4.f.i.z.l.3.7.s.y.v.i' }
var store_0 = createStore(reducer)
// Output:
// userReducer 이 전달받은 μƒνƒœ {} 와 μ•‘μ…˜ { type: '@@redux/INIT' }
// itemsReducer 이 전달받은 μƒνƒœ [] 와 μ•‘μ…˜ { type: '@@redux/INIT' }

output을 보면 μ•Œκ² μ§€λ§Œ, 각 reducerλŠ” 초기 μ•‘μ…˜ @@redux/INIT을 μ •ν™•ν•˜κ²Œ ν˜ΈμΆœν–ˆλ‹€. 그런데 λ‹€λ₯Έ μ•‘μ…˜μ€ 뭐지? combineReducersμ—μ„œ μ‹€ν–‰λœ sanity check 이닀. 이것은 reducerκ°€ μƒνƒœλ₯Ό 리턴할 λ•Œ undefinedκ°€ μ•„λ‹ˆλΌλŠ” 것을 ν™•μΈν•œλ‹€. combineReducersμ—μ„œ init action의 첫번째 호좜 λ˜ν•œ 같은 λͺ©μ μ„ κ³΅μœ ν•œλ‹€. (sanity check λ₯Ό ν•˜λŠ” 것)

console.log('μ΄ˆκΈ°ν™” 이후 store_0 의 μƒνƒœ:', store_0.getState())
// Output:
// μ΄ˆκΈ°ν™” 이후 store_0 의 μƒνƒœ: { user: {}, items: [] }

Reduxκ°€ 각 μƒνƒœλ“€μ„ μ™„λ²½ν•˜κ²Œ μ²˜λ¦¬ν•˜κ³  μžˆλ‹€. λ§ˆμ§€λ§‰ μƒνƒœλŠ” μ‹€μ œλ‘œ userReducer와 itemsReduces둜 λ§Œλ“€μ–΄μ§„ λ‹¨μˆœν•œ ν•΄μ‹œλ‹€.

{
    user: {}, // {} userReducer μ—μ„œ λ¦¬ν„΄λœ 쑰각
    items: [] // [] itemsReducer μ—μ„œ λ¦¬ν„΄λœ 쑰각
}

reducerλ“€μ˜ μƒνƒœλ₯Ό νŠΉμ • κ°’(userReducerλŠ” {}, itemsReducerλŠ” [])으둜 μ΄ˆκΈ°ν™”ν–ˆκΈ°λ•Œλ¬Έμ— λ§ˆμ§€λ§‰ μƒνƒœμ—μ„œ 이 값이 λ‚˜μ˜¨ 것은 λ‹Ήμ—°ν•˜λ‹€.

이제 reducer κ°€ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ μ•Œκ²Œλ˜μ—ˆμœΌλ‹ˆκΉŒ μ•‘μ…˜μ„ dispatchν–ˆμ„ λ•Œ Redux μƒνƒœμ— 영ν–₯을 μ£ΌλŠ” 것을 봐보자.

λ‹€μŒ: 06_dispatch-action.md