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 AmericaChrome13
Bob SmithEuropeFirefox19
Carol WhiteAsiaSafari26
David BrownSouth AmericaEdge7
Eva GreenAfricaOpera34
Alice JohnsonNorth AmericaChrome43
Bob SmithEuropeFirefox51
Carol WhiteAsiaSafari36
David BrownSouth AmericaEdge92
Eva GreenAfricaOpera49
Alice JohnsonNorth AmericaChrome48
Bob SmithEuropeFirefox78
Carol WhiteAsiaSafari17
David BrownSouth AmericaEdge99
Eva GreenAfricaOpera88
Alice JohnsonNorth AmericaChrome12
Bob SmithEuropeFirefox45
Carol WhiteAsiaSafari85
David BrownSouth AmericaEdge99
Eva GreenAfricaOpera4
Alice JohnsonNorth AmericaChrome69
Bob SmithEuropeFirefox55
Carol WhiteAsiaSafari49
David BrownSouth AmericaEdge22
Eva GreenAfricaOpera33
Alice JohnsonNorth AmericaChrome54
Bob SmithEuropeFirefox65
Carol WhiteAsiaSafari57
David BrownSouth AmericaEdge92
Eva GreenAfricaOpera45
Alice JohnsonNorth AmericaChrome64
Bob SmithEuropeFirefox92
Carol WhiteAsiaSafari2
David BrownSouth AmericaEdge94
Eva GreenAfricaOpera57
Alice JohnsonNorth AmericaChrome40
Bob SmithEuropeFirefox37
Carol WhiteAsiaSafari94
David BrownSouth AmericaEdge15
Eva GreenAfricaOpera5
Alice JohnsonNorth AmericaChrome76
Bob SmithEuropeFirefox5
Carol WhiteAsiaSafari53
David BrownSouth AmericaEdge7
Eva GreenAfricaOpera92
Alice JohnsonNorth AmericaChrome98
Bob SmithEuropeFirefox72
Carol WhiteAsiaSafari42
David BrownSouth AmericaEdge36
Eva GreenAfricaOpera57
Alice JohnsonNorth AmericaChrome88
Bob SmithEuropeFirefox61
Carol WhiteAsiaSafari28
David BrownSouth AmericaEdge5
Eva GreenAfricaOpera80
Alice JohnsonNorth AmericaChrome51
Bob SmithEuropeFirefox99
Carol WhiteAsiaSafari76
David BrownSouth AmericaEdge89
Eva GreenAfricaOpera66

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