减速器组成:减速器只在其中一个情况下调用另一个减速器,但为其余的减速器工作

时间:2017-02-06 18:17:15

标签: redux

人。 我一直在学习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_POSTSINVALIDATE_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

1 个答案:

答案 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)
  })