2016-07-19 42 views
4

在我的項目中,我有一個動作創建器,它依賴於處於應用程序狀態的值來生成新值或決定要分派的操作。我的問題是要知道哪種方法是正確的。我想到了兩種方法。行動的創建者中訪問這些值:從組件中傳遞值作爲參數狀態或訪問動作創建者中的狀態?

export const changePreviousPage =() => { 
    return (dispatch, getState) => { 
     let pagination = getState().appReducers.availability.pagination; 

     let previousPage = pagination.actualPage != 1 ? pagination.actualPage - 1 : pagination.actualPage; 
     dispatch({ 
      type: types.CHANGE_PREVIOUS_PAGE, 
      previousPage 
     }); 
    } 
}; 

我以爲對方選擇是從組件到行動的創建者傳遞值:

在我的組件

class Pagination extends Component { 
    ... 
    handlePreviousPage() { 
     const {pagination} = this.props; 
     this.props.changePreviousPage(pagination); 
    } 
    ... 
} 

在我的動作創作者

export const changePreviousPage = pagination => { 
    let previousPage = pagination.actualPage != 1 ? pagination.actualPage - 1 : pagination.actualPage; 

    return{ 
     type: types.CHANGE_PREVIOUS_PAGE, 
     previousPage 
    } 
}; 

解決它的最佳方法是什麼?

回答

0

在我看來,總是在最接近執行時使用/檢索狀態,這裏是動作創建者(或更確切地說是您將返回的thunk然後執行)。

請記住,調度可能有任何數量的中間件在實際的store.dispatch調用之前運行。這可以包括異步中間件,所以狀態可能在調用調度和它最終運行的store.dispatch調用之間發生了變化。

另一個要考慮的問題是,您可能會在動作創建者中分派多個事物,這些動作創建者會更改狀態並使您傳遞到頂部動作創建者的內容無效。另外一個原因,我認爲動作創建者頂部的let state = getState()是一個壞主意,除非您確定在處理過程中沒有任何變化(只要您涉及任何API調用,我總是會再次使用getState(),而不是使用一個存儲的變量)。

將數據從狀態轉換爲道具(使用redux容器和連接助手方法)會在每次更改時都會導致重新渲染,這在某些情況下可能會影響性能。

我的個人編碼偏好也是儘可能簡化mapDispatchToProps(假設您正在傳遞handlePreviousPage等處理程序)並避免任何數據處理(在您的示例中,它並不多,但您可以如果你正在爲你的動作創建者準備數據,很容易看到這可能會失控)。

相關問題