2017-04-26 36 views
0

我有一個簡單的React App。它允許用戶編輯表單以更新數據庫中的數據。在提交頁面上,用表單數據生成一個動作。一個Redux Saga產生這個動作並異步更新數據庫。這一切都有效。Redux-Saga中的狀態變化

但是在一種情況下,更新涉及更多。不僅必須添加新數據,還必須在一系列API調用中從數據庫中刪除表單上刪除的任何數據。要做到這一點,我需要知道發生了什麼變化(例如刪除了什麼),而不僅僅是新的狀態。

我的傳奇如何獲得這些信息?我可以在減速器中計算它,因爲它可以訪問先前的狀態,但通常認爲它是減速器發出新動作的反模式。

+0

當你說的數據庫,這是否意味着在服務器上的數據庫?你在編輯表單時是否正在更新?這樣做的具體原因是什麼? –

+0

是的,通過異步調用訪問服務器上的數據庫。它在表單提交時更新,而不是編輯表單。有另一種方法嗎?也許我從完全錯誤的方向來到這裏。 – amay

+0

如果您不將表單的中間狀態發送到服務器,那麼這些不需要刪除。那些只在你的本地州。你可以放棄這些,只提交表單的最終狀態。這與我想的服務器有關。也許你可以添加一些關於你如何實現的代碼。還有你正在使用的庫?像還原形式等? –

回答

1

薩加斯有一個select效果可用,它只是運行一個選擇器函數並返回提取的狀態。你可以用這個來檢索終極版店新老項目,並妥善處理存在的變化:

function* handleFormUpdates() { 
    const oldItem = yield select(selectOldItem); 
    const newItem = yield select(selectNewItem); 

    const changes = diffTheItems(oldItem, newItem); 

    // make API calls to deal with changes appropriately 
} 

總的來說,這是一個很好的理由,以保持「臨時」或「草案」狀態Redux,以便您可以在邏輯中使用「當前」和「草稿」值。

我討論我的博客文章Practical Redux, Part 7: Form Change Handling, Data Editing, and Feature Reducers一些相關的概念和Practical Redux, Part 8: Form Draft Data Management

+0

我認爲這是問題,我在Redux商店沒有舊狀態。我試圖做的是將存儲中的數據從寫入數據庫的方式中分離出來,以便實際上我可以根據需要在不影響View的情況下更改數據庫API。感謝您的帖子的鏈接,儘管我可能必須閱讀所有內容才能看到它。 – amay