Reactjs Redux传奇中的状态变化

Reactjs Redux传奇中的状态变化,reactjs,redux,redux-saga,Reactjs,Redux,Redux Saga,我有一个简单的React应用程序。它允许用户编辑表单以更新数据库中的数据。在提交时,页面生成一个包含表单数据的操作。Redux传奇将屈服于操作并异步更新数据库。这一切都有效 然而,在一个案例中,更新稍微复杂一些。不仅必须添加新数据,而且必须通过一系列API调用从数据库中删除表单上删除的任何数据。为此,我需要知道发生了什么变化(例如,删除了什么),而不仅仅是新状态 我的传奇如何获得这些信息?我可以在reducer中计算它,因为它可以访问以前的状态,但它通常被认为是reducer的一种反模式,然后它

我有一个简单的React应用程序。它允许用户编辑表单以更新数据库中的数据。在提交时,页面生成一个包含表单数据的操作。Redux传奇将屈服于操作并异步更新数据库。这一切都有效

然而,在一个案例中,更新稍微复杂一些。不仅必须添加新数据,而且必须通过一系列API调用从数据库中删除表单上删除的任何数据。为此,我需要知道发生了什么变化(例如,删除了什么),而不仅仅是新状态


我的传奇如何获得这些信息?我可以在reducer中计算它,因为它可以访问以前的状态,但它通常被认为是reducer的一种反模式,然后它会分派一个新的操作

Sagas有一个可用的
select
效果,它只运行一个选择器函数并返回提取的状态。您可以使用此选项从Redux存储中检索旧项目和新项目,并处理其中的更改:

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中保持“临时”或“草稿”状态的一个很好的理由,这样您就可以在逻辑中同时使用“当前”和“草稿”值

我在我的博客文章和文章中讨论了一些相关概念

…必须删除表单上删除的任何数据 可以通过一系列API调用从数据库中删除。要做到这一点,我 需要知道发生了什么变化(例如删除了什么),而不是 只是新的状态

如果我理解正确,您已经将表单状态保存在redux存储中,您需要知道何时以及发生了什么更改。您可以创建自己的观察者传奇:

function* watchFormUpdates(){
  while (true) {
    const oldFormState = yield select(selectors.selectFormState);
    const action = yield take (actionTypes.FORM_UPDATE); // wait until action is dispatched
    const newFormState = yield select(selectors.selectFormState); // at this point store has been updated
    // compare oldFormState with newFormState...
    if(oldFormState.hasSubscription && !newFormState.hasSubscription) {
      yield fork(deleteSubscriptionSaga); // start non-blocking worker task
      // or just dispatch action - yield put(actionCreators.deleteSubscription());
    }
  }
}

当你说数据库时,是指服务器上的数据库吗?您在编辑表单时是否正在更新?这样做的具体原因是什么?是的,通过异步调用访问服务器上的数据库。它在提交表单时更新,而不是在编辑表单时更新。还有别的办法吗?也许我是从完全错误的方向来的。如果你不将表单的中间状态发送到服务器,那么这些状态就不需要被删除。这些只在你所在的州。您可以放弃这些,只提交表单的最终状态。我想这就是与服务器相关的内容。也许您可以添加一些代码来说明您是如何尝试实现的。还有,您正在使用哪些库?像redux表单等?我不会向服务器发送中间状态。问题是,一旦提交表单,我需要知道该记录中发生了什么变化,以删除不再属于该记录的数据。我将尝试编写一些简化的代码来说明我要实现的目标。我认为这就是问题所在,我在Redux存储中没有旧的状态。我试图做的是将存储区中的数据与写入数据库的方式分离,这样在本质上,如果需要的话,我可以在不影响视图的情况下更改数据库API。谢谢你的文章链接,尽管我可能不得不全部阅读才能正确地理解。