我们正在我们的react / redux应用程序中实现性能优化。这些优化的一部分包括引入重新选择。这适用于直接来自州的数据。但是从其他道具衍生的数据呢?
示例:
我们有3个组件Feed
FeedItem
和Contact
(联系人是用于显示用户联系信息的组件)。
a FeedItem
获取表示Feed中项目的对象,Feed项的属性之一是actor对象。这个对象就像一个用户,但有点不同(这很糟糕,但不能改变)。这意味着如果我想为这个actor渲染Contact
,我需要创建一个新的对象,将属性从actor映射到用户。在每个渲染上创建一个新对象是一种性能反模式,因为我们使用浅层相等检查。
例如代码:
<Contact
user={{
photoUrl: actor.photo.smallPhotoUrl,
Id: actor.id,
Name: actor.name,
}}
</Contact>
有解决这个问题的模式吗? reselect只支持来自redux状态的派生数据,这基本上是来自props的派生数据。
答案 0 :(得分:3)
您可以传递任何想要重新选择的选择器方法。它不必是状态和道具。这恰好是它最常见的用例。如果它生成了具有任意数量参数的选择器,则可以调用一个。
以下是您可以使用它的一种方式:
function convertActorToContactUser(actor) {
return {
photoUrl: actor.photo.smallPhotoUrl,
Id: actor.id,
Name: actor.name,
};
}
class ActorContact extends Component {
constructor(...args) {
super(...args);
this.getUser = createSelector(
() => this.props.actor,
convertActorToContactUser
);
}
render() {
return <Contact user={this.getUser()} />
}
}