React-Virtualized Autosizer calculates height as 0 for VirtualScroll

JWayne picture JWayne · Jul 13, 2016 · Viewed 12.3k times · Source

Where AutoSizer's width gives me an appropriate value, I'm consistently getting an Autosizer height of 0, which causes the VirtualScroll component not to display. However, if i use the disableHeight prop and provide VirtualScroll with a fixed value for height (i.e. 200px), VirtualScroll displays rows as expected. Can anyone see whats wrong?

Ultimately, the Autosizer is meant to live inside a Material-ui Dialog component, but I have also tried simply rendering the autosizer into a div. Same issue.

render() {
return (
  <Dialog
    modal={false}
    open={this.state.open}
    onRequestClose={this.handleClose}
    contentStyle={pageOptionsDialog.body}
  >
  <div>
    <AutoSizer>
      {({ width, height }) => (
        <VirtualScroll
          id="virtualScroll"
          onRowsRendered={this.props.loadNextPage}
          rowRenderer={this.rowRenderer}
          height={height}
          rowCount={this.props.rowCount}
          rowHeight={30}
          width={width}
        />
      )}
    </AutoSizer>
  </div>
</dialog>
)}

Answer

bvaughn picture bvaughn · Jul 13, 2016

This typically means you haven't set the parent's styles correctly.

In the snippet you posted, the parent is a <div>, which by default is a "block" element- meaning it fills the full width automatically. However block elements have no native/default height so AutoSizer reports a height of 0.

To fix this, just set a style on the <div> of either height: 100% or flex: 1 etc. The <div> should then grow and AutoSizer will report a height > 0.

Checkout the docs too to avoid other similar gotchas: * https://github.com/bvaughn/react-virtualized/blob/master/docs/AutoSizer.md#examples * https://github.com/bvaughn/react-virtualized/blob/master/docs/usingAutoSizer.md