我试图从redux状态反规范化一些数据,但我不能让它工作。我已经尝试过以我能想到的各种方式组合denormalize函数。这是一个猜谜游戏,到目前为止还没有任何工作。
首先,我将产品数据标准化并将其置于状态。
这些实体被放入state.data.products
,包括产品。
state.data: {
products: {
products: {
9: {
id: 9
attributes: [ 10, 45, 23 ],
things: [23, 55, 77]
},
11 //etc
}
attributes: {
10: {
id: 10
},
45: //etc
},
things: { //etc
}
}
所以有一个属性"产品"包括所有实体,还有另一个"产品"对于"产品"实体。
规范化工作没有问题:
normalize(data, [productSchema]);
" productSchema"定义如下:
productSchema = new schema.Entity('products', {
attributes: [attributeSchema],
things: [thingsSchema],
//+ other stuff
});
现在我想对产品进行非规范化处理,例如9。
我用" connect"在视图组件中调用此函数以从状态检索数据并对其进行非规范化:
export const denormalizeProduct = (state, productId) => {
const entities = state.data.products;
return denormalize(
productId,
[productSchema],
entities
);
}
如果我致电denormalizeProductById(state, 9)
,我只会回复9
。
(与此question类似,但我无法从中找到解决方案,并将两个示例混合在一起)
如果我把" productSchema"没有数组:
return denormalize(
productId,
productSchema,
entities
);
我收到错误:TypeError: entities[schemaKey] is undefined
。
我尝试过的所有内容都会产生" 9"或上述错误。
修改: 发现错误 - 将其添加到下面
答案 0 :(得分:0)
我发现错误 - 我的一个架构错了:我创建了new schema.Entity('shippingZones')
但是在reducer中我将它添加到具有不同名称的状态:
shipping_zones: action.payload.shippingZones
所以它正在寻找" shippingZones"虽然只有" shipping_zones"我猜。所以我将其更改为new schema.Entity('shipping_zones')
和shipping_zones: action.payload.shipping_zones
遗憾的是,TypeError: entities[schemaKey] is undefined
消息无法指定" shippingZones"那么我本可以节省几天时间。
所以这段代码最终起作用了:
const entities = state.data.products;
return denormalize(
productId,
productSchema,
entities
);