使用normalizr

时间:2018-05-09 14:43:34

标签: redux denormalization normalizr

我试图从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"或上述错误。

修改: 发现错误 - 将其添加到下面

1 个答案:

答案 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
);