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 AmericaChrome10
Bob SmithEuropeFirefox44
Carol WhiteAsiaSafari48
David BrownSouth AmericaEdge9
Eva GreenAfricaOpera76
Alice JohnsonNorth AmericaChrome62
Bob SmithEuropeFirefox9
Carol WhiteAsiaSafari88
David BrownSouth AmericaEdge47
Eva GreenAfricaOpera11
Alice JohnsonNorth AmericaChrome11
Bob SmithEuropeFirefox97
Carol WhiteAsiaSafari81
David BrownSouth AmericaEdge53
Eva GreenAfricaOpera35
Alice JohnsonNorth AmericaChrome25
Bob SmithEuropeFirefox13
Carol WhiteAsiaSafari51
David BrownSouth AmericaEdge67
Eva GreenAfricaOpera58
Alice JohnsonNorth AmericaChrome5
Bob SmithEuropeFirefox79
Carol WhiteAsiaSafari89
David BrownSouth AmericaEdge70
Eva GreenAfricaOpera75
Alice JohnsonNorth AmericaChrome95
Bob SmithEuropeFirefox51
Carol WhiteAsiaSafari34
David BrownSouth AmericaEdge88
Eva GreenAfricaOpera60
Alice JohnsonNorth AmericaChrome7
Bob SmithEuropeFirefox30
Carol WhiteAsiaSafari19
David BrownSouth AmericaEdge3
Eva GreenAfricaOpera7
Alice JohnsonNorth AmericaChrome11
Bob SmithEuropeFirefox92
Carol WhiteAsiaSafari39
David BrownSouth AmericaEdge22
Eva GreenAfricaOpera18
Alice JohnsonNorth AmericaChrome24
Bob SmithEuropeFirefox48
Carol WhiteAsiaSafari86
David BrownSouth AmericaEdge85
Eva GreenAfricaOpera94
Alice JohnsonNorth AmericaChrome1
Bob SmithEuropeFirefox10
Carol WhiteAsiaSafari44
David BrownSouth AmericaEdge72
Eva GreenAfricaOpera55
Alice JohnsonNorth AmericaChrome70
Bob SmithEuropeFirefox56
Carol WhiteAsiaSafari13
David BrownSouth AmericaEdge42
Eva GreenAfricaOpera66
Alice JohnsonNorth AmericaChrome96
Bob SmithEuropeFirefox81
Carol WhiteAsiaSafari49
David BrownSouth AmericaEdge37
Eva GreenAfricaOpera82

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