2016-05-09 34 views
0

在我的應用程序中,我有小動作創建器函數,它爲應用程序的一小部分返回一個動作。我的理性存在是,我想用自己的邏輯作爲'精確的&',但保持代碼的可重用性。Redux - 正確調度行動

舉個例子,我有React'tab'組件,它們在任何地方都可以重用。在一種情況下,單擊'選項卡'將使選項卡激活,執行其他必需的操作。在其他情況下,單擊'選項卡'將使選項卡處於活動狀態,然後執行其他操作,可能與上述第一種情況不同。

我想到的邏輯是我會在上面的每個場景中派遣兩個動作創建者。第一個顯然是常見的,第二個是每個場景都獨有的。

// rough code for illustrative purposes 
activateTab :() => { 
dispatch(actionCreator1); 
dispatch(actionCreator2); 
}, 
render:() => { 
<Tab onclick = { activateTab } 
} 

問題(?): 我發生在我每個動作的創造者分派會打電話然後作出反應運行它的「不同」算法減速功能&。即在上面的Tab中,React重新計算了所有DOM更改兩次?它是否正確?有人可以確認嗎?

這些情況應該如何處理?

我是否應該爲每個場景設置獨特的動作類型(&從而操作對象)?這意味着,應該只有一個調度功能。

感謝,

回答

1

我應該做的動作類型(&從而操作對象)唯一的每個場景?

大概你已經這樣做了,如果你正在調度兩個不同的動作是正確的?我認爲你不需要SET_TAB動作,如果你從不使用它,你唯一需要的是在減速器中聽更多的動作。

在任何情況下,你的假設都是正確的,讓一個reducer監聽許多不同的動作是完全正常的。考慮你的活動標籤減速看起來是這樣的:

let initial = { 
    fooActiveTab: 0, // first foo tab is open 
    barActiveTab: 2, // third bar tab is open 
} 

function activeTab (state, action) { 
    switch (action.type) { 

    case 'SOMETHING_RELEVANT_TO_FOO': 
    case 'FOO_AJAX_SUCCESS': 
     return { 
     ...state, 
     fooActiveTab: action.payload // set current tab 
     } 

    default: 
     return state 

    } 
} 

這使你的減速機組成很清楚,作爲標籤的狀態聽各種各樣的事情,可能會改變活動的標籤是什麼。這樣你就不需要在每個函數調用中分派兩個動作。只要你發送你想要激活的標籤的id,就足夠了。

我想你應該做到上述,但不是爲了防止React運行差異算法..但要更有條理。 React的diff/patch會運行A LOT,你的應用程序仍然會非常快。您感覺到的任何緩慢都是由於組件實際更新,因爲DOM需要更改,而不是因爲reconciliation

+0

謝謝Azium。我認爲應該創造出獨特的「動作類型」,然而,在減速器中,「開關 - >案例」應該集中於返回一些小變化。畢竟,所有減速器都會被要求採取一切行動。再次感謝。 – Kayote

相關問題