constructor(props: Props) {
    super(props);
    invariant(
      this.props.numToRenderAhead < this.props.maxNumToRender,
      'WindowedListView: numToRenderAhead must be less than maxNumToRender'
    );
    this._computeRowsToRenderBatcher = new Batchinator(
      () => this._computeRowsToRender(this.props),
      this.props.recomputeRowsBatchingPeriod,
    );
    this._viewabilityHelper = new ViewabilityHelper({
      viewAreaCoveragePercentThreshold: this.props.viewablePercentThreshold,
    });
    this.state = {
      firstRow: 0,
      lastRow: Math.min(this.props.data.length, this.props.initialNumToRender) - 1,
    };
  }
Recomputing which rows to render is batched up and run asynchronously to avoid wastful updates,
e.g. from multiple layout updates in rapid succession.