2017-03-28 51 views
1

我有一個學生名單,我的應用程序總是顯示當時的一名學生,activePupil。到目前爲止,我有兩個減速器。其中包含並默認返回所有孩子的列表(在數組的形式):從不同的減速機訪問減速機?

[ 
{ 
    id: 1 
    name: Barack 
}, 
{ 
    id: 2 
    name: Donald 
} 
] 

...然後我有一個activePupilReducer,其中包含當前查看的瞳孔。所以例如

{ 
    id: 2 
    name: Donald 
} 

現在我不知道如何迭代到下一個學生。當動作「UPDATE_ACTIVE」被分派時,我希望我的activePupilReducer將活躍的學生更新爲下一個學生。所以我需要抓住我的學生的當前身份證,重複它,然後從另一個減速器中拿出正確的身份證號碼(或者我認爲我必須這樣做)。現在我activePupilReducer看起來是這樣的:

export default function (state={id: -1, name:"John"}, action) { 
    switch (action.type) { 
     case "UPDATE_ACTIVE": 
     // ?? 
     default: 
     return state; 
    } 
} 

我會以某種方式需要搶在對方減速,抓住下一個元素,但我不知道我會如何去了解這一點。

回答

1

在我看來,活躍的學生和學生本身的名單應該生活在同一個減速器內。因此,例如,只有一個瞳孔減速器,其狀態是一個對象。然後按照你現在的做法行動。

也有說,減速器是純粹的任何副作用,因此是不是你做什麼的地方做你想要做的。你可以做的是計算你的reducer/action之外的下一個學生,例如在某個組件中單擊按鈕,然後將它傳遞給你的update_active動作,然後將它傳遞給你的reducer以設置爲活動的學生。

+0

所以如果我正確理解你,我完全在錯誤的軌道上,試圖在reducer中實現這個功能?這很有趣,因爲我目前在我的行動中已經有了它,但是我認爲我在那裏實施了反模式。 –

0

activePupilReducer的範圍不夠寬。它應該能夠看到activePupil密鑰和pupils陣列都能正常工作。

如果您使用的是combineReducers,您可能不會讓他們訪問彼此的狀態。與有機會獲得這兩個鍵

{ 
    pupils: [...] 
    activePupil: {...} 
} 

當調用UPDATE_ACTIVE行動,這種單減速,並能夠執行狀態突變:你應該這兩個減速合併成一個,並使用以下狀態的結構。

+0

我正在使用聯合減速器,所以,最後,我的商店看起來就像你引用的那個。那麼我會如果我正確理解你,只是在我的組合減速器中實現這個功能,因爲我需要訪問這兩個數據塊? –

+0

您的減速器應該可以訪問**兩個**條目。您需要將兩個**都置於商店中的同一個密鑰下,因此它們可以通過同一個縮減器訪問。所以,'store = {data:{pupils,activePupil}}' – slezica