0

我正在使用 Redux 和 ImmutableJS 来管理我的应用程序的状态。我创建了以下两条记录:

export const OrderRecord = Record({
    id: null,
    productId: null,
    amount: 1,
});

export const ProductRecord = Record({
    id: null,
    name: '',
    price: 0,
});

我的全局状态基于 normalizr 方法进行标准化,如下所示:

const state = {
    entities: {
        orders: new OrderedMap(new Map({
            1: new OrderRecord(createOrderItem(1, 1)),
        })),
        products: new OrderedMap(new Map({
            1: new ProductRecord(createProductItem(1)),
        })),
    },
};
  • 我将此规范用于测试目的。

现在我正在尝试使用 Reselect 对计算字段进行一些选择。

export const getVisibleOrders = createSelector(
    [getProducts, getOrders],
    (products, orders) => {
        orders.map(order => {
            const product = products.get(order.productId.toString());
            if (!product) {
                return order;
            }
            const totalPrice = order.amount * product.price;
            order.set('productName', product.name);
            order.set('totalPrice', totalPrice);
            return order;
        });
    }
); 

,但我收到以下错误消息:

错误:无法在记录中设置未知键“productName”

我知道原因 - 记录不能包含任何未定义的键,但我的问题是:是否有任何建议的方法如何优雅地解决这个问题?

  • 我不想扩展我的记录来支持这种计算参数(product.name 和 totalPrice)。
  • 我不想将静态参数和计算参数保存在一个地方,因为例如“productName”参数来自“Product”实体而不是“Order”实体。

谢谢你。

4

1 回答 1

1

使用的全部Immutable.Record目的是不要让您向记录添加新密钥,因此您会收到错误消息。如果你想在外面使用选择器,那么选择器的全部意义就是暴露这样的“计算”属性。在您的情况下,如果您需要使用点分语法,您可以简单地返回一个新的 Map() 对象或一个新的记录类型:

return Map({
  productName: 'foobar'
}).merge(order)
于 2016-07-30T13:50:05.650 回答