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 SmithEuropeFirefox34
Carol WhiteAsiaSafari5
David BrownSouth AmericaEdge3
Eva GreenAfricaOpera92
Alice JohnsonNorth AmericaChrome30
Bob SmithEuropeFirefox73
Carol WhiteAsiaSafari65
David BrownSouth AmericaEdge40
Eva GreenAfricaOpera38
Alice JohnsonNorth AmericaChrome2
Bob SmithEuropeFirefox2
Carol WhiteAsiaSafari44
David BrownSouth AmericaEdge5
Eva GreenAfricaOpera45
Alice JohnsonNorth AmericaChrome73
Bob SmithEuropeFirefox4
Carol WhiteAsiaSafari76
David BrownSouth AmericaEdge59
Eva GreenAfricaOpera32
Alice JohnsonNorth AmericaChrome39
Bob SmithEuropeFirefox74
Carol WhiteAsiaSafari25
David BrownSouth AmericaEdge79
Eva GreenAfricaOpera24
Alice JohnsonNorth AmericaChrome99
Bob SmithEuropeFirefox79
Carol WhiteAsiaSafari77
David BrownSouth AmericaEdge89
Eva GreenAfricaOpera25
Alice JohnsonNorth AmericaChrome18
Bob SmithEuropeFirefox98
Carol WhiteAsiaSafari80
David BrownSouth AmericaEdge21
Eva GreenAfricaOpera62
Alice JohnsonNorth AmericaChrome29
Bob SmithEuropeFirefox86
Carol WhiteAsiaSafari68
David BrownSouth AmericaEdge45
Eva GreenAfricaOpera18
Alice JohnsonNorth AmericaChrome13
Bob SmithEuropeFirefox63
Carol WhiteAsiaSafari84
David BrownSouth AmericaEdge2
Eva GreenAfricaOpera30
Alice JohnsonNorth AmericaChrome65
Bob SmithEuropeFirefox100
Carol WhiteAsiaSafari50
David BrownSouth AmericaEdge7
Eva GreenAfricaOpera53
Alice JohnsonNorth AmericaChrome50
Bob SmithEuropeFirefox37
Carol WhiteAsiaSafari76
David BrownSouth AmericaEdge39
Eva GreenAfricaOpera55
Alice JohnsonNorth AmericaChrome82
Bob SmithEuropeFirefox50
Carol WhiteAsiaSafari51
David BrownSouth AmericaEdge74
Eva GreenAfricaOpera30

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