2017-04-26 72 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