官方redux减速机的例子不清楚

时间:2016-10-11 21:03:32

标签: action redux reducers

我正在尝试了解官方的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时被调用。

在我看来,在这种情况下我们有多个侦听器来执行相同的操作。试图了解原因。

2 个答案:

答案 0 :(得分:0)

fscanf(file1, "%c", &c)REQUEST_POSTS的功能由per-subreddit处理,由#>更高级"减速器。

例如,RECEIVE_POSTS是通过postsBySubreddit公开的减速器。而不是将其功能放入combineReducers,而是将操作传递给postsBySubreddit reducer,它仅设置和接收给定subreddit的状态

posts

没有理由在[action.subreddit]: posts(state[action.subreddit], action) 中公开posts缩减器;状态由subreddit-exclusive reducer更新。

所有相同的逻辑都可以在combineReducers中处理,但这会使postsBySubreddit更大更混乱。 postsBySubreddit作用于州的(subreddit-sepcific)切片。这只是一个问题的分离。

具体细节:

  • posts
  • 处理的每个操作都会调用它
  • 它是单独定义的,因此状态切片在一个地方处理(postsBySubreddit),并且特定于子编辑的状态操作在一个地方处理(postsBySubreddit
  • 在顶层只有posts才能看到操作 - 但这些邮件会像其他任何重构一样委托给postsBySubreddit

答案 1 :(得分:0)

posts函数内部调用postsBySubreddit()函数:

case REQUEST_POSTS:
   return Object.assign({}, state, {
    [action.subreddit]: posts(state[action.subreddit], action)
})

它是单独定义的,以明确逻辑如何工作。 postsBySubreddit负责确定哪些 subreddit的数据应该更新,post负责更新单个subreddit的数据。它有效地分离了顾虑。这两个函数都知道如何更新某些数据以响应给定的操作。

引用文档:

  

Redux的核心是一个非常简单的设计模式:你所有的"写"逻辑进入单个函数,运行该逻辑的唯一方法是给Redux一个简单的对象来描述已发生的事情。 Redux存储调用写入逻辑函数并传入当前状态树和描述对象,写入逻辑函数返回一些新状态树,Redux存储通知任何订阅者状态树已更改。

这里的关键是一个" root reducer"功能本身由许多较小的功能组成,共同完成工作。因此,从某种意义上说,只有一个监听器,即根减速器。但是,从另一个意义上说,有许多听众,因为根减少器功能将其职责委托给许多其他功能来完成实际工作。

我鼓励您仔细阅读Redux文档。特别是,您应该阅读ReducersRedux FAQ(特别是Reducers上的常见问题解答部分)和新的Structuring Reducers部分。请务必仔细阅读Prerequisite Concepts中列出的一些文章。