我正在尝试了解官方的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时被调用。
在我看来,在这种情况下我们有多个侦听器来执行相同的操作。试图了解原因。
答案 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文档。特别是,您应该阅读Reducers,Redux FAQ(特别是Reducers上的常见问题解答部分)和新的Structuring Reducers部分。请务必仔细阅读Prerequisite Concepts中列出的一些文章。