假设我animals
在 redux 商店。它是一个规范化的对象,键是对象,id
值是对象本身。每只动物都有一把钥匙is_dog
。
animals: {
'id1': { location: 'foo', is_dog: true, name: 'Dog1' },
'id2': { location: 'foo', is_dog: false, name: 'Cat1' },
'id3': { location: 'foo', is_dog: false, name: 'Cat2' },
'id4': { location: 'foo', is_dog: true, name: 'Dog2' },
}
我有一个DogsList
连接的反应组件,它查看存储状态并将数组传递dogIds
给 UI 组件。的计算dogIds
类似于:
dogIds = _.chain(state.animals).filter('is_dog').map('id').value();
在上面的示例中,这将返回['id1', 'id4']
.
但是,假设我有数千只动物,并且每只动物都有其他经常变化的属性,比如currentLocation
,lastFed
等。我知道只有在任何动物发生变化dogIds
时才会改变is_dog
,但我不太确定如何不做过滤器并对任何动物的每次变化进行不必要的映射计算。我尝试使用reselect
,但我认为在这种情况下它真的没有帮助。
我倾向于dogIds
正确存储在 redux 中,并且仅在相关时手动更新它。就像将一只新狗添加到 中animals
,或者如果一只猫变成了一只狗(我的类比在这里分崩离析)。但是我觉得通过将计算属性保存在 redux 存储中我做错了。