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 AmericaChrome19
Bob SmithEuropeFirefox22
Carol WhiteAsiaSafari76
David BrownSouth AmericaEdge48
Eva GreenAfricaOpera74
Alice JohnsonNorth AmericaChrome74
Bob SmithEuropeFirefox95
Carol WhiteAsiaSafari48
David BrownSouth AmericaEdge33
Eva GreenAfricaOpera46
Alice JohnsonNorth AmericaChrome52
Bob SmithEuropeFirefox74
Carol WhiteAsiaSafari6
David BrownSouth AmericaEdge30
Eva GreenAfricaOpera3
Alice JohnsonNorth AmericaChrome64
Bob SmithEuropeFirefox18
Carol WhiteAsiaSafari3
David BrownSouth AmericaEdge10
Eva GreenAfricaOpera66
Alice JohnsonNorth AmericaChrome52
Bob SmithEuropeFirefox2
Carol WhiteAsiaSafari29
David BrownSouth AmericaEdge8
Eva GreenAfricaOpera39
Alice JohnsonNorth AmericaChrome86
Bob SmithEuropeFirefox45
Carol WhiteAsiaSafari77
David BrownSouth AmericaEdge37
Eva GreenAfricaOpera89
Alice JohnsonNorth AmericaChrome4
Bob SmithEuropeFirefox91
Carol WhiteAsiaSafari2
David BrownSouth AmericaEdge11
Eva GreenAfricaOpera16
Alice JohnsonNorth AmericaChrome79
Bob SmithEuropeFirefox67
Carol WhiteAsiaSafari77
David BrownSouth AmericaEdge25
Eva GreenAfricaOpera71
Alice JohnsonNorth AmericaChrome90
Bob SmithEuropeFirefox35
Carol WhiteAsiaSafari8
David BrownSouth AmericaEdge89
Eva GreenAfricaOpera12
Alice JohnsonNorth AmericaChrome13
Bob SmithEuropeFirefox5
Carol WhiteAsiaSafari61
David BrownSouth AmericaEdge8
Eva GreenAfricaOpera75
Alice JohnsonNorth AmericaChrome3
Bob SmithEuropeFirefox10
Carol WhiteAsiaSafari45
David BrownSouth AmericaEdge60
Eva GreenAfricaOpera51
Alice JohnsonNorth AmericaChrome87
Bob SmithEuropeFirefox25
Carol WhiteAsiaSafari76
David BrownSouth AmericaEdge25
Eva GreenAfricaOpera97

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