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 AmericaChrome30
Bob SmithEuropeFirefox40
Carol WhiteAsiaSafari10
David BrownSouth AmericaEdge18
Eva GreenAfricaOpera23
Alice JohnsonNorth AmericaChrome52
Bob SmithEuropeFirefox41
Carol WhiteAsiaSafari12
David BrownSouth AmericaEdge34
Eva GreenAfricaOpera3
Alice JohnsonNorth AmericaChrome77
Bob SmithEuropeFirefox17
Carol WhiteAsiaSafari68
David BrownSouth AmericaEdge46
Eva GreenAfricaOpera45
Alice JohnsonNorth AmericaChrome97
Bob SmithEuropeFirefox81
Carol WhiteAsiaSafari49
David BrownSouth AmericaEdge42
Eva GreenAfricaOpera40
Alice JohnsonNorth AmericaChrome31
Bob SmithEuropeFirefox87
Carol WhiteAsiaSafari52
David BrownSouth AmericaEdge75
Eva GreenAfricaOpera84
Alice JohnsonNorth AmericaChrome72
Bob SmithEuropeFirefox57
Carol WhiteAsiaSafari27
David BrownSouth AmericaEdge100
Eva GreenAfricaOpera63
Alice JohnsonNorth AmericaChrome46
Bob SmithEuropeFirefox22
Carol WhiteAsiaSafari66
David BrownSouth AmericaEdge70
Eva GreenAfricaOpera93
Alice JohnsonNorth AmericaChrome64
Bob SmithEuropeFirefox46
Carol WhiteAsiaSafari93
David BrownSouth AmericaEdge77
Eva GreenAfricaOpera72
Alice JohnsonNorth AmericaChrome7
Bob SmithEuropeFirefox79
Carol WhiteAsiaSafari60
David BrownSouth AmericaEdge27
Eva GreenAfricaOpera95
Alice JohnsonNorth AmericaChrome10
Bob SmithEuropeFirefox14
Carol WhiteAsiaSafari6
David BrownSouth AmericaEdge31
Eva GreenAfricaOpera92
Alice JohnsonNorth AmericaChrome98
Bob SmithEuropeFirefox43
Carol WhiteAsiaSafari35
David BrownSouth AmericaEdge67
Eva GreenAfricaOpera17
Alice JohnsonNorth AmericaChrome45
Bob SmithEuropeFirefox85
Carol WhiteAsiaSafari12
David BrownSouth AmericaEdge60
Eva GreenAfricaOpera78

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