我使用redux和normalizr来规范化服务器的响应,基本上遵循real-world示例 . 这种方式 entities
reducer非常简单,只需合并响应即可 . 我现在遇到的问题是 delete
操作 . 我发现这个issue#21 of normalizr repo但仍然无法弄清楚如何解决这个问题 . 例如,
目前的状态是
{
entities:
product_categories: {
...
13: {
...
products: ["1", "2"], <--------------- [i] Current state
...
}
},
products: {
1: {
id: "1"
}
}
}
标准化的响应是
{
...
product_categories: {
...
13: {
...
products: ["1"], <---------------- [2] Normalized result
}
...
}
如您所见,后端api只返回 all product ids that belonged to this category ,在这种情况下"2"已分离 . 当'entities' reducer合并此响应时,"2"仍然悬而未决 . 现在我只是重新加载页面,但我是一个更好的方法来处理这种情况?
在 entities
reducer中,我只是像现实世界中的例子一样合并它 .
return merge({}, state, action.payload.entities);
3 回答
只是不要担心它在那里 . 将您的状态视为数据库 . 您不会真正从数据库中删除记录,以避免复杂的级联 - 通常您只需更改其在数据库中的状态 . 类似地,使用Normalizer,而不是真正删除实体,让它们在缓存中,直到用户离开页面!
下面是我的解决方案后面的代码解释 .
要执行删除,我已将我的reducer更新为处理删除操作:
REMOVE_ENTITY_ITEM
. 在操作中,我传递了要删除的实体的id
和name
.在reducer中,我首先删除
store.entities[entityName][entityId]
处的实体本身 . 接下来我需要将其id
从可能引用它的所有其他实体中删除 . 因为我使用normalizr
所有实体都是扁平的,如果它们引用另一个实体,那么它们只会在数组中有它的id . 这使得删除引用相对简单 . 我只是循环遍历所有实体并过滤掉对要删除的实体的引用 .我将此方法与#1的其他两种方法结合使用 . )刷新app / state和#2 . )翻转实体状态位而不是删除然后过滤UI中关闭的项目 . 这些方法已得到很好的讨论here
现在要删除我触发这样的动作:
使用lodash assign . 如果使用合并将无法正常工作 .
例:
在这里,您的代码将如何