有效地计算来自反应道具的派生数据

时间:2016-12-14 10:12:00

标签: reactjs redux reselect

我们正在我们的react / redux应用程序中实现性能优化。这些优化的一部分包括引入重新选择。这适用于直接来自州的数据。但是从其他道具衍生的数据呢?

示例:

我们有3个组件Feed FeedItemContact(联系人是用于显示用户联系信息的组件)。

a FeedItem获取表示Feed中项目的对象,Feed项的属性之一是actor对象。这个对象就像一个用户,但有点不同(这很糟糕,但不能改变)。这意味着如果我想为这个actor渲染Contact,我需要创建一个新的对象,将属性从actor映射到用户。在每个渲染上创建一个新对象是一种性能反模式,因为我们使用浅层相等检查。

例如代码:

<Contact
  user={{
    photoUrl: actor.photo.smallPhotoUrl,
    Id: actor.id,
    Name: actor.name,
  }}
</Contact>

有解决这个问题的模式吗? reselect只支持来自redux状态的派生数据,这基本上是来自props的派生数据。

1 个答案:

答案 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()} />
  }
}