我最近开始在一个新的 React 应用程序中使用normalizr和zustand 。到目前为止,这是一次非常好的体验,解决了我过去遇到的大部分痛苦问题。
我刚刚遇到了一个问题,在过去的几天里我想不出一个干净的方法来解决。
想象一下,我有一个 normalizr-normalized 状态,如下所示:
{
"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,直到用户单击 Save 按钮(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
,这似乎太乏味和解决方法.
感谢你的帮助。
PS这里有类似的解释。问题是在我们的例子中,generateId('comment')
逻辑发生在后端。