CxJS

Buffering

import { Grid } from 'cx/widgets'; Copied

Grid supports buffered rendering which dramatically improves performance with large datasets. Instead of rendering all rows, only visible rows plus a buffer are rendered, enabling smooth scrolling with thousands of records.

<div controller={PageController}>
  <Grid
    records={m.records}
    keyField="id"
    buffered
    style="height: 400px"
    mod={["fixed-layout", "contain"]}
    cached
    selection={{ type: KeySelection, bind: m.selection }}
    columns={[
      {
        header: "#",
        align: "center",
        children: <div class="cxe-grid-row-number" />,
        defaultWidth: 70,
      },
      {
        header: { text: "Name", style: "width: 100%" },
        field: "fullName",
        sortable: true,
        resizable: true,
      },
      {
        header: "Continent",
        field: "continent",
        sortable: true,
        resizable: true,
        defaultWidth: 130,
      },
      {
        header: "Browser",
        field: "browser",
        sortable: true,
        resizable: true,
        defaultWidth: 100,
      },
      {
        header: "Visits",
        field: "visits",
        sortable: true,
        align: "right",
        resizable: true,
        defaultWidth: 70,
      },
    ]}
  />
</div>
#Name
Continent
Browser
Visits
Alice JohnsonNorth AmericaChrome14
Bob SmithEuropeFirefox16
Carol WhiteAsiaSafari8
David BrownSouth AmericaEdge14
Eva GreenAfricaOpera58
Alice JohnsonNorth AmericaChrome14
Bob SmithEuropeFirefox30
Carol WhiteAsiaSafari43
David BrownSouth AmericaEdge33
Eva GreenAfricaOpera99
Alice JohnsonNorth AmericaChrome48
Bob SmithEuropeFirefox15
Carol WhiteAsiaSafari11
David BrownSouth AmericaEdge30
Eva GreenAfricaOpera47
Alice JohnsonNorth AmericaChrome74
Bob SmithEuropeFirefox90
Carol WhiteAsiaSafari46
David BrownSouth AmericaEdge54
Eva GreenAfricaOpera27
Alice JohnsonNorth AmericaChrome70
Bob SmithEuropeFirefox61
Carol WhiteAsiaSafari25
David BrownSouth AmericaEdge57
Eva GreenAfricaOpera68
Alice JohnsonNorth AmericaChrome96
Bob SmithEuropeFirefox56
Carol WhiteAsiaSafari93
David BrownSouth AmericaEdge58
Eva GreenAfricaOpera40
Alice JohnsonNorth AmericaChrome21
Bob SmithEuropeFirefox78
Carol WhiteAsiaSafari74
David BrownSouth AmericaEdge13
Eva GreenAfricaOpera6
Alice JohnsonNorth AmericaChrome38
Bob SmithEuropeFirefox79
Carol WhiteAsiaSafari66
David BrownSouth AmericaEdge98
Eva GreenAfricaOpera41
Alice JohnsonNorth AmericaChrome16
Bob SmithEuropeFirefox10
Carol WhiteAsiaSafari91
David BrownSouth AmericaEdge20
Eva GreenAfricaOpera44
Alice JohnsonNorth AmericaChrome70
Bob SmithEuropeFirefox46
Carol WhiteAsiaSafari25
David BrownSouth AmericaEdge8
Eva GreenAfricaOpera40
Alice JohnsonNorth AmericaChrome22
Bob SmithEuropeFirefox95
Carol WhiteAsiaSafari94
David BrownSouth AmericaEdge55
Eva GreenAfricaOpera58
Alice JohnsonNorth AmericaChrome39
Bob SmithEuropeFirefox84
Carol WhiteAsiaSafari55
David BrownSouth AmericaEdge61
Eva GreenAfricaOpera98

This grid contains 5,000 rows but renders smoothly thanks to buffered mode. Try scrolling and sorting to see the performance.

How It Works

Enable buffered mode by setting the buffered property. The grid calculates which rows are visible and renders only those plus a configurable buffer for smooth scrolling.

<Grid
  records={m.records}
  buffered
  style="height: 400px"
  mod={["fixed-layout", "contain"]}
  cached
  columns={columns}
/>

For optimal performance, combine buffering with:

  • Fixed height - The grid needs a fixed height to calculate visible rows
  • mod="fixed-layout" - Uses CSS table-layout: fixed for faster rendering
  • mod="contain" - Adds CSS containment for better browser optimization
  • cached - Prevents row re-renders when unrelated store data changes

Row Numbers

Use the built-in cxe-grid-row-number class to display automatic row numbers:

{
  header: "#",
  defaultWidth: 50,
  children: <div class="cxe-grid-row-number" />
}

Configuration

PropertyTypeDescription
bufferedbooleanEnables buffered rendering mode.
bufferSizenumberNumber of rows to render outside the visible area. Default is 60.
bufferStepnumberNumber of rows to add/remove when scrolling. Default is 15.
cachedbooleanPrevents row re-renders when unrelated store data changes. Rows only update when their record data changes.
lockColumnWidthsbooleanLocks column widths to prevent layout shifts during scrolling.
lockColumnWidthsRequiredRowCountnumberMinimum number of rows required before column widths are locked.
measureRowsOnScrollbooleanRe-measures row heights while scrolling. Useful for variable height rows.

See also: Infinite Scrolling