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 AmericaChrome65
Bob SmithEuropeFirefox48
Carol WhiteAsiaSafari37
David BrownSouth AmericaEdge48
Eva GreenAfricaOpera65
Alice JohnsonNorth AmericaChrome98
Bob SmithEuropeFirefox50
Carol WhiteAsiaSafari78
David BrownSouth AmericaEdge54
Eva GreenAfricaOpera41
Alice JohnsonNorth AmericaChrome67
Bob SmithEuropeFirefox31
Carol WhiteAsiaSafari22
David BrownSouth AmericaEdge55
Eva GreenAfricaOpera40
Alice JohnsonNorth AmericaChrome35
Bob SmithEuropeFirefox5
Carol WhiteAsiaSafari66
David BrownSouth AmericaEdge11
Eva GreenAfricaOpera55
Alice JohnsonNorth AmericaChrome6
Bob SmithEuropeFirefox81
Carol WhiteAsiaSafari16
David BrownSouth AmericaEdge5
Eva GreenAfricaOpera90
Alice JohnsonNorth AmericaChrome22
Bob SmithEuropeFirefox93
Carol WhiteAsiaSafari37
David BrownSouth AmericaEdge50
Eva GreenAfricaOpera24
Alice JohnsonNorth AmericaChrome94
Bob SmithEuropeFirefox39
Carol WhiteAsiaSafari56
David BrownSouth AmericaEdge42
Eva GreenAfricaOpera97
Alice JohnsonNorth AmericaChrome29
Bob SmithEuropeFirefox50
Carol WhiteAsiaSafari48
David BrownSouth AmericaEdge46
Eva GreenAfricaOpera30
Alice JohnsonNorth AmericaChrome65
Bob SmithEuropeFirefox16
Carol WhiteAsiaSafari64
David BrownSouth AmericaEdge78
Eva GreenAfricaOpera21
Alice JohnsonNorth AmericaChrome76
Bob SmithEuropeFirefox93
Carol WhiteAsiaSafari45
David BrownSouth AmericaEdge63
Eva GreenAfricaOpera100
Alice JohnsonNorth AmericaChrome73
Bob SmithEuropeFirefox47
Carol WhiteAsiaSafari54
David BrownSouth AmericaEdge47
Eva GreenAfricaOpera63
Alice JohnsonNorth AmericaChrome15
Bob SmithEuropeFirefox75
Carol WhiteAsiaSafari60
David BrownSouth AmericaEdge45
Eva GreenAfricaOpera95

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