2016-10-24 65 views
1

在redux中,如果特定的減速器狀態發生更改,我想顯示一個模態。只有在用戶正在查看特定組件時纔有意義。我用容器的mapDispatchToProps(publishState來自減速):根據減速器狀態變化在特定組件中分配動作

const mapDispatchToProps = (stateProps, dispatchProps, ownProps) => { 

    const {dispatch} = dispatchProps; 
    const {appType, publishState, publishStages} = stateProps; 
    const isWebsite = (appType !== 'MOBILE'); 

    switch (publishState.stage) { 
     case publishStages.GENERATING_BUILDREQUEST: 
     case publishStages.WAITING: 
     case publishStages.WORKING: 
     case publishStages.UPLOADING: 
      dispatch(showModal(modalTypes.PUBLISH_MODAL, {isWebsite})); 
      break; 

     case publishStages.COMPLETED: 
      dispatch(showModal(modalTypes.PUBLISH_SUCCESS_MODAL, {isWebsite})); 
      break; 

     case publishStages.ERROR: 
      dispatch(showModal(modalTypes.PUBLISH_FAILURE_MODAL, {isWebsite})); 
      break; 

     default: 
      dispatch(closeModal()); 
    } 

    return {... 

然而,這並不覺得優雅的人們不會想到的映射功能來調整狀態。任何想法如何正確實現這一目標?

回答

3

我確實不會在mapDispatchToProps函數中調用dispatch。這個函數應該是「純粹」的,只需返回一個沒有任何副作用的映射。

既然你知道什麼行動應該觸發模態即。當publicStages被設置爲一個特定的值,我建議在服用2級可能的方式改變狀態的護理:

  1. 您可以在減速做到這一點。當您更改publicStages時,減速器也可以訪問模態狀態,並對其進行更改。
  2. 在行動。在更改PublicStages的操作中,根據您使用publicStages所做的操作調用操作以打開/關閉模式。注意調用調度應該是異步的。在這種情況下,您還需要從行動中派遣,因此您必須將派遣功能傳遞給行動。

編輯:按照意見的討論 - 和完整性 - 如果模式僅作爲一個可視化組件的部分顯示出來,你也可以存儲其open/closed狀態的組件本身和管理它componentWillMountcomponentWillUpdate。關於來自Redux的創建者Dan Abramov的一個有趣的閱讀是You Might Not Need Redux

+0

事情是我只想在特定組件可見時看到模態。也許我可以使用你的建議方法2與componentDidMount/componentWillUnmount來調整isModalVisible減速器參數。 – Guy

+1

如果模態僅依賴於組件,您還可以執行的操作是管理組件本身的打開/關閉狀態,而不是涉及到redux。 Redux表示應用程序的狀態,可以認爲模式只是該組件的一部分,與redux狀態無關。有時這種簡單的修復使應用程序的方式更易於理解和推理。 –

相關問題