2016-10-11 20 views
0

公式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 

私はそれが(REQUEST_POSTS)postsBySubredditを呼び出すことにより、一回呼び出されることを知っているが、アクションRECEIVE_POSTSが送出されたときにも、後の工程でそれが呼び出されます。

私はこのケースでは複数のリスナーを同じように扱っているようです。理由を理解しようとしています。

答えて

0

posts機能がpostsBySubreddit()関数の内部で呼び出されます。

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

ロジックがどのように動作するか、それを明確にするために別々に定義されています。 postsBySubredditであり、サブreditのデータを更新する必要があり、postは1つのサブreditのデータを更新する責任があります。それは事実上懸念の分離です。どちらの関数も、与えられたアクションに応答していくつかのデータを更新する方法を知っています。

は、ドキュメントからの引用:その中核に

、Reduxのは本当にかなりシンプルなデザインパターンである:すべてのあなたの「書き込み」ロジックは、単一の関数になり、そしてそのロジックを実行するための唯一の方法はにありますReduxに何か起こったことを記述する明白なオブジェクトを与えます。 Reduxストアは、論理関数を書き込み、現在の状態ツリーと記述オブジェクトを渡し、書き込み論理関数はいくつかの新しい状態ツリーを返し、Reduxストアは状態ツリーが変更されたことを通知します。

ここでの重要な点は、「ルートレデューサー」の機能自体が、それを構成する多数の小さな機能で構成されていることです。したがって、1つの意味では、唯一のリスナー、ルートレデューサーがあります。しかし、別の意味では、多くのリスナーがあります。ルート・リデューサの機能は、実際の作業を行うために他の多くの機能に責任を委ねているからです。

Reduxのドキュメントをよくお読みください。特に、ReducersRedux FAQ(特にFAQセクションはReducers)と新しいStructuring Reducersセクションをお読みください。 Prerequisite Conceptsに記載されている記事の一部を必ず読んでください。

+0

Daveと同じ質問です。後でRECEIVE_POSTSが送出されたときに、「投稿」がどのように呼び出されるのか分かりません。 postsBySubredditのRECEIVE_POSTS:のケースには、ハンドラ関数はありません。 – tito

+0

'postsBySubreddit'関数は、switch文を使って3つのケースすべてを同じように処理しています。複数のケースを一列に並べることで、同じコードでそれぞれのケースを処理できます。したがって、3つのケース(INVALIDATE_SUBREDDIT、RECEIVE_POSTS、およびREQUEST_POSTS)はすべて同じ方法で処理されます:その特定の投稿のデータと現在のアクションで 'posts()'を呼び出すことによって。 – markerikson

+0

私は今それを得る。素晴らしい答え。ありがとう – tito

0

REQUEST_POSTSおよびRECEIVE_POSTSという機能性は、「上位レベル」レデューサーによって呼び出されるレデューサーによってサブレッジごとに処理されます。

など、postsBySubredditは、combineReducersで公開されたレジューサーです。 postsBySubredditにその機能を置くのではなくアクションが設定され、与えられたsubredditため状態のみを受信する、posts減速に渡されます。

[action.subreddit]: posts(state[action.subreddit], action) 

combineReducersposts減速を公開する理由はありません。状態はサブデジット専用排除装置によって更新されます。

同じロジックのすべてがpostsBySubredditで取り扱われている可能性が、それはpostsBySubredditが大きく、メシエなるだろう。 postsは、状態のサブスライス(subreddit-sepcific)スライスに作用します。それは懸念の分離です。

細目:

  • これは、状態のスライスが1位(postsBySubreddit)で処理され、subreddit固有の状態操作を1つの場所で処理されるので、それを別々に定義されていますpostsBySubreddit
  • で扱うすべてのアクションで呼ばれています(posts
  • トップレベルでは、postsBySubredditのみがアクションを表示しますが、これらのメッセージは他のリファクタリングと同様にpostsに委譲されます。
+0

私は最初の部分を理解していますが、後でRECEIVE_POSTSが送信されたとき、「投稿」がどのように呼び出されるのか分かりません。 postsBySubredditのRECEIVE_POSTS:のケースには、ハンドラ関数はありません。 – tito

+1

@tito \t確かにそうです。 JSのケースステートメントが失敗します。 –

+0

ありがとうございました。あなたの説明も素晴らしかった!!! – tito

関連する問題