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 SmithEuropeFirefox95
Carol WhiteAsiaSafari1
David BrownSouth AmericaEdge11
Eva GreenAfricaOpera53
Alice JohnsonNorth AmericaChrome17
Bob SmithEuropeFirefox79
Carol WhiteAsiaSafari82
David BrownSouth AmericaEdge56
Eva GreenAfricaOpera14
Alice JohnsonNorth AmericaChrome77
Bob SmithEuropeFirefox97
Carol WhiteAsiaSafari32
David BrownSouth AmericaEdge52
Eva GreenAfricaOpera66
Alice JohnsonNorth AmericaChrome88
Bob SmithEuropeFirefox65
Carol WhiteAsiaSafari35
David BrownSouth AmericaEdge28
Eva GreenAfricaOpera3
Alice JohnsonNorth AmericaChrome12
Bob SmithEuropeFirefox10
Carol WhiteAsiaSafari63
David BrownSouth AmericaEdge6
Eva GreenAfricaOpera46
Alice JohnsonNorth AmericaChrome26
Bob SmithEuropeFirefox43
Carol WhiteAsiaSafari21
David BrownSouth AmericaEdge32
Eva GreenAfricaOpera66
Alice JohnsonNorth AmericaChrome24
Bob SmithEuropeFirefox11
Carol WhiteAsiaSafari14
David BrownSouth AmericaEdge61
Eva GreenAfricaOpera50
Alice JohnsonNorth AmericaChrome48
Bob SmithEuropeFirefox3
Carol WhiteAsiaSafari51
David BrownSouth AmericaEdge46
Eva GreenAfricaOpera65
Alice JohnsonNorth AmericaChrome69
Bob SmithEuropeFirefox26
Carol WhiteAsiaSafari96
David BrownSouth AmericaEdge45
Eva GreenAfricaOpera56
Alice JohnsonNorth AmericaChrome50
Bob SmithEuropeFirefox90
Carol WhiteAsiaSafari3
David BrownSouth AmericaEdge6
Eva GreenAfricaOpera30
Alice JohnsonNorth AmericaChrome35
Bob SmithEuropeFirefox54
Carol WhiteAsiaSafari69
David BrownSouth AmericaEdge65
Eva GreenAfricaOpera26
Alice JohnsonNorth AmericaChrome22
Bob SmithEuropeFirefox14
Carol WhiteAsiaSafari16
David BrownSouth AmericaEdge68
Eva GreenAfricaOpera99

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