Я пытаюсь понять официальный пример редуктора Redux.Официальный пример сокращения редуктора не ясен
Я не уверен, кто называет эту функцию «сообщений», почему она определена отдельно и почему эта функция никогда не подвергалась методу CombineReducer, но каким-то образом вызывается при отправке действий.
import { combineReducers } from 'redux'
import {
SELECT_SUBREDDIT, INVALIDATE_SUBREDDIT,
REQUEST_POSTS, RECEIVE_POSTS
} from './actions'
function selectedSubreddit(state = 'reactjs', action) {
switch (action.type) {
case SELECT_SUBREDDIT:
return action.subreddit
default:
return state
}
}
function posts(state = {
isFetching: false,
didInvalidate: false,
items: []
}, action) {
switch (action.type) {
case INVALIDATE_SUBREDDIT:
return Object.assign({}, state, {
didInvalidate: true
})
case REQUEST_POSTS:
return Object.assign({}, state, {
isFetching: true,
didInvalidate: false
})
case RECEIVE_POSTS:
return Object.assign({}, state, {
isFetching: false,
didInvalidate: false,
items: action.posts,
lastUpdated: action.receivedAt
})
default:
return state
}
}
function postsBySubreddit(state = { }, action) {
switch (action.type) {
case INVALIDATE_SUBREDDIT:
case RECEIVE_POSTS:
case REQUEST_POSTS:
return Object.assign({}, state, {
[action.subreddit]: posts(state[action.subreddit], action)
})
default:
return state
}
}
const rootReducer = combineReducers({
postsBySubreddit,
selectedSubreddit
})
export default rootReducer
Я знаю, что она вызывается один раз по телефону postsBySubreddit (REQUEST_POSTS), но и позже, в процессе он вызывается, когда действие RECEIVE_POSTS отправляется.
Мне кажется, что у нас есть несколько слушателей в этом случае для тех же действий. Попытка понять, почему.
Тот же вопрос для вас, что и для Дейва; позже, когда отправляется RECEIVE_POSTS, я не понимаю, как вызываются «сообщения». Случай RECEIVE_POSTS: в postsBySubreddit не имеет никакой функции обработчика. – tito
Функция 'postsBySubreddit' использует оператор switch для обработки всех трех случаев одинаково. Помните, что, ставя несколько случаев подряд, вы можете обрабатывать каждый из этих случаев одним и тем же кодом. Таким образом, все три случая (INVALIDATE_SUBREDDIT, RECEIVE_POSTS и REQUEST_POSTS) будут обрабатываться одинаково: путем вызова 'posts()' с данными для этой конкретной записи и текущего действия. – markerikson
Я понял. Отличный ответ. Thanks – tito