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 AmericaChrome16
Bob SmithEuropeFirefox54
Carol WhiteAsiaSafari54
David BrownSouth AmericaEdge96
Eva GreenAfricaOpera48
Alice JohnsonNorth AmericaChrome40
Bob SmithEuropeFirefox22
Carol WhiteAsiaSafari90
David BrownSouth AmericaEdge77
Eva GreenAfricaOpera88
Alice JohnsonNorth AmericaChrome19
Bob SmithEuropeFirefox51
Carol WhiteAsiaSafari39
David BrownSouth AmericaEdge85
Eva GreenAfricaOpera40
Alice JohnsonNorth AmericaChrome29
Bob SmithEuropeFirefox12
Carol WhiteAsiaSafari83
David BrownSouth AmericaEdge30
Eva GreenAfricaOpera44
Alice JohnsonNorth AmericaChrome14
Bob SmithEuropeFirefox43
Carol WhiteAsiaSafari67
David BrownSouth AmericaEdge40
Eva GreenAfricaOpera52
Alice JohnsonNorth AmericaChrome70
Bob SmithEuropeFirefox21
Carol WhiteAsiaSafari19
David BrownSouth AmericaEdge4
Eva GreenAfricaOpera49
Alice JohnsonNorth AmericaChrome53
Bob SmithEuropeFirefox75
Carol WhiteAsiaSafari9
David BrownSouth AmericaEdge76
Eva GreenAfricaOpera38
Alice JohnsonNorth AmericaChrome69
Bob SmithEuropeFirefox74
Carol WhiteAsiaSafari12
David BrownSouth AmericaEdge76
Eva GreenAfricaOpera64
Alice JohnsonNorth AmericaChrome74
Bob SmithEuropeFirefox1
Carol WhiteAsiaSafari45
David BrownSouth AmericaEdge66
Eva GreenAfricaOpera69
Alice JohnsonNorth AmericaChrome59
Bob SmithEuropeFirefox27
Carol WhiteAsiaSafari97
David BrownSouth AmericaEdge17
Eva GreenAfricaOpera14
Alice JohnsonNorth AmericaChrome37
Bob SmithEuropeFirefox27
Carol WhiteAsiaSafari51
David BrownSouth AmericaEdge63
Eva GreenAfricaOpera89
Alice JohnsonNorth AmericaChrome64
Bob SmithEuropeFirefox28
Carol WhiteAsiaSafari53
David BrownSouth AmericaEdge86
Eva GreenAfricaOpera37

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