我最近开始在一个新的React应用程序中使用带有zustand的normalizer。到目前为止,这是一次非常好的经历,解决了我过去遇到的大多数痛苦的问题。
我刚刚遇到了一个问题,在过去的几天里,我想不出一个干净的方法来解决这个问题。
想象一下,我有一个normalizer归一化状态,看起来像:
{
"entities": {
"triggers": {
"1": {
"id": 1,
"condition": "WHEN_CURRENCY_EXCHANGED",
"enabled": true,
"value": "TRY"
},
"2": {
"id": 2,
"condition": "WHEN_CURRENCY_EXCHANGED",
"enabled": true,
"value": "GBP"
},
"3": {
"id": 3,
"condition": "WHEN_TRANSACTION_CREATED",
"enabled": true,
"value": true
}
},
"campaigns": {
"19": {
"id": 19,
"name": "Some campaign name",
"triggers": [
1,
2,
3
]
}
}
},
"result": 19
}
我们有一个页面,允许用户向活动添加一个或多个触发器,然后保存它们。问题是,在添加这些触发器时,直到用户单击"保存"按钮(id由数据库生成(,它们才有id。单击Save按钮时,状态为denormalize
d(通过normalizr
的denormalize
功能(,并作为有效载荷发送到后端,如下所示:
{
"id": 19,
"name": "Some campaign name",
"triggers": [
{
"id": 1,
"condition": "WHEN_CURRENCY_EXCHANGED",
"enabled": true,
"value": "TRY"
},
{
"id": 2,
"condition": "WHEN_CURRENCY_EXCHANGED",
"enabled": true,
"value": "GBP"
},
{
"id": 3,
"condition": "WHEN_TRANSACTION_CREATED",
"enabled": true,
"value": true
}
]
}
问题是,如果用户将实体添加到triggers
,它就没有id,因为id是由数据库生成的,并且我找不到将其添加到状态的正确方法(由于规范化状态的基于id的特性(。
我能想到的唯一解决办法是,当在前端添加触发器但尚未保存时,生成一些临时ID(例如uuid(,然后在非规范化时检查每个实体,做一些类似if (isUuid(trigger.id)) delete trigger.id
的事情,这似乎太乏味和变通了。
感谢你的帮助。
附言:这里也有类似的解释。问题是,在我们的案例中,generateId('comment')
逻辑发生在后端。
一个简单的解决方案是拆分。
create trigger
API调用和add trigger to campaign
API调用。
执行第一个操作,然后使用后端生成的id将trigger
保存到规范化存储中。
然后将其添加到campaign
中。