React/Redux加载数据有副作用



假设我有一个预订系统的存根。

当我创建预订时,我可以在我们的客户中搜索并选择我正在预订的客户。在选择客户后,相关联的客户联系人会作为副作用加载。作为用户,我必须选择其中一个联系人进行预订。

让我们假设我的状态形状是这样的:

{
customer: {id: 1, name: "Dandy Inc"}
customerContacts: [{id:1, name: "John Doe"},{id:2, name: "John Doe"}]
customerContactId: 2
}

保存后,我只保存customerId和customerContactId。

现在假设我想在未来某个时间点编辑此预订。

我可以选择

1) 获取我拥有的数据,基本上"回放"操作以触发我需要的副作用(例如,设置客户并触发加载客户联系人的副作用)或

2) 获取我拥有的数据,手动加载我需要的任何额外数据,然后一次性设置完整的应用程序状态。

你对最佳路线有什么想法?这是一个简化的例子,假设现实世界中的场景至少有2-4个额外的副作用需要触发。

听起来应该概括create/loadCustomerBooking功能来处理是否存在customerContactId(非常多的伪代码):

populateCustomerBooking = (customerId, customerContactId) =>
loadContacts(customerId)
if (customerContactId) 
setContactWithSideEffects(customerContactId)
runOtherCustomerSideEffects(customerId)
// And so on...
// This is called when a contact is chosen or we're loading.
setContactWithSideEffects = (customerContactId) =>
dispatch(SET_CUSTOMER_CONTACT)
runContactSideEffects()

我想这在某种程度上更适合你的第一个选择。你可能应该把这个复杂的调度和副作用序列封装在一个传奇故事中,只需一个动作就可以开始。你有一个复杂的传奇故事阻止了TAKE的副作用,等待着这个动作的启动。类似于您在这个redux传奇示例中发现的内容。

创建时有这样的序列:

createBooking -> chooseCustomer -> dispatch(POPULATE_BOOKING(customerId))

当加载时

loadBooking -> dispatch(POPULATE_BOOKING(customerId, customerContactId))

你复杂的populateCustomerBooking传奇故事就像是对POPULATE_BOOKING动作的takeEvery。这允许您重用所有这些逻辑,因为听起来应该是相同的。在我看来,这种方法更可取,因为它遵循DRY原则,允许行为是可预测和可维护的——你不会忘记在一个地方更新它并破坏它。要测试的代码也更少;)

最新更新