人。 我一直在学习redux,还有一些我无法完全理解的减速器。
在redux docs中,提供了一个简单的例子。 在所述示例的减速器中,有一个减速器调用另一个减速器。 这是这些reducer的代码:
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
}
}
如您所见,postsBySubreddit
来电posts
。我理解这一点;它是减速剂成分。
我不明白为什么只在posts
情况下调用REQUEST_POSTS
减速器而不在其余情况下调用,但它为其他情况正确更新状态。
我有缺陷的逻辑告诉我,为了使postsBySubreddit
在所有情况下都能正常工作,它应该在RECEIVE_POSTS
和INVALIDATE_SUBREDDIT
案例中采用相同的机制,如下所示:
function postsBySubreddit(state = {}, action) {
switch (action.type) {
case INVALIDATE_SUBREDDIT:
return Object.assign({}, state, {
[action.subreddit]: posts(state[action.subreddit], action)
})
case RECEIVE_POSTS:
return Object.assign({}, state, {
[action.subreddit]: posts(state[action.subreddit], action)
})
case REQUEST_POSTS:
return Object.assign({}, state, {
[action.subreddit]: posts(state[action.subreddit], action)
})
default:
return state
}
}
我错过了什么? 提前致谢。 P.D.可以找到此示例的完整源代码here。
答案 0 :(得分:2)
如果你有多个交换机盒堆叠在一起,它们都将运行底壳的语句。
在这个例子中
case INVALIDATE_SUBREDDIT:
case RECEIVE_POSTS:
case REQUEST_POSTS:
return Object.assign({}, state, {
[action.subreddit]: posts(state[action.subreddit], action)
})
与
相同case INVALIDATE_SUBREDDIT:
return Object.assign({}, state, {
[action.subreddit]: posts(state[action.subreddit], action)
})
case RECEIVE_POSTS:
return Object.assign({}, state, {
[action.subreddit]: posts(state[action.subreddit], action)
})
case REQUEST_POSTS:
return Object.assign({}, state, {
[action.subreddit]: posts(state[action.subreddit], action)
})