2017-03-02 48 views
1

我在我的redux商店中有一個步驟的數組。我的我的步驟減速通過處理的一系列動作操縱步驟列表:Redux操作和共享驗證

  • ADD_STEP_REQUEST
  • REMOVE_STEP_REQUEST
  • MOVE_STEP_UP_REQUEST
  • MOVE_STEP_DOWN_REQUEST

到目前爲止好。

我現在有一個要求,每次改變步驟的順序(或者當添加或刪除一個步驟時)都要執行一種驗證。在此驗證過程中,我需要檢查每個步驟以查看它之前的步驟是否滿足特定標準。如果沒有,我不想拒絕這些更改。我只想在步驟中設置一個isInvalid標誌,並最終改變UI在步驟中的顯示方式。

我可以處理這增加了validateOrder()函數(即應用標誌並返回步驟)由減速器在每個case語句的結束時運行的最簡單方法:

case ADD_STEP_REQUEST: { 
    const amendedSteps = // add a step 
    return validateOrder(amendedSteps); 
} 

case REMOVE_STEP_REQUEST: { 
    const amendedSteps = // remove a step 
    return validateOrder(amendedSteps); 
} 

case MOVE_STEP_UP_REQUEST: { 
    const amendedSteps = // reorder steps 
    return validateOrder(amendedSteps); 
} 

case MOVE_STEP_DOWN_REQUEST: { 
    const amendedSteps = // reorder steps 
    return validateOrder(amendedSteps); 
} 

然而,這種感覺不對,因爲我需要在所有病例陳述中重複呼叫validateOrder

有沒有更好的方法來處理這個問題?

回答

1

減速機只是一個功能。你可以用另一個功能包裝它:

const yourReducer = (state = 'your initial state', action) => { 
    switch (action.type) { 
    case ADD_STEP_REQUEST: 
     // ... 
     return amendedSteps 

    case ... 
    } 
} 

const validatedReducer = (state, action) => { 
    switch (action.type) { 
    case ADD_STEP_REQUEST: 
    case REMOVE_STEP_REQUEST: 
    case MOVE_STEP_UP_REQUEST: 
    case MOVE_STEP_DOWN_REQUEST: 
     return validateOrder(yourReducer(state, action)) 

    default: 
     return yourReducer(state, action) 
    } 
} 

現在你分開的責任。原來的減速器不需要關心驗證。 validatedReducer將照顧這一點。

如果validateOrder必須適用於所有的情況,那麼你就需要在validatedReducer switch語句,因此,它將成爲:

const validatedReducer = (state, action) => 
    validateOrder(yourReducer(state, action))