Skip to content

Hide individual rows to avoid rendering them as DOM elements. It helps you reduce screen clutter and improve the grid’s performance.

Overview

“Hiding a row” means that the hidden row doesn’t get rendered as a DOM element.

When you’re hiding a row:

  • The source data doesn’t get modified.
  • The HiddenRows plugin doesn’t participate in data transformation
    (the shape of the data returned by the getData*() methods stays intact).

Enable row hiding

To enable row hiding, use the hiddenRows option.

JavaScript
import Handsontable from 'handsontable/base';
import { registerAllModules } from 'handsontable/registry';
// Register all Handsontable's modules.
registerAllModules();
const container = document.querySelector('#example1');
new Handsontable(container, {
licenseKey: 'non-commercial-and-evaluation',
data: [
['A1', 'B1', 'C1', 'D1', 'E1'],
['A2', 'B2', 'C2', 'D2', 'E2'],
['A3', 'B3', 'C3', 'D3', 'E3'],
['A4', 'B4', 'C4', 'D4', 'E4'],
['A5', 'B5', 'C5', 'D5', 'E5'],
['A6', 'B6', 'C6', 'D6', 'E6'],
['A7', 'B7', 'C7', 'D7', 'E7'],
['A8', 'B8', 'C8', 'D8', 'E8'],
['A9', 'B9', 'C9', 'D9', 'E9'],
['A10', 'B10', 'C10', 'D10', 'E10'],
['A11', 'B11', 'C11', 'D11', 'E11'],
['A12', 'B12', 'C12', 'D12', 'E12'],
],
height: 'auto',
colHeaders: true,
rowHeaders: true,
// enable the `HiddenRows` plugin
hiddenRows: {
rows: [3, 5, 9],
// show UI indicators to mark hidden rows
indicators: true,
},
autoWrapRow: true,
autoWrapCol: true,
});
TypeScript
import Handsontable from 'handsontable/base';
import { registerAllModules } from 'handsontable/registry';
// Register all Handsontable's modules.
registerAllModules();
const container = document.querySelector('#example1')!;
new Handsontable(container, {
licenseKey: 'non-commercial-and-evaluation',
data: [
['A1', 'B1', 'C1', 'D1', 'E1'],
['A2', 'B2', 'C2', 'D2', 'E2'],
['A3', 'B3', 'C3', 'D3', 'E3'],
['A4', 'B4', 'C4', 'D4', 'E4'],
['A5', 'B5', 'C5', 'D5', 'E5'],
['A6', 'B6', 'C6', 'D6', 'E6'],
['A7', 'B7', 'C7', 'D7', 'E7'],
['A8', 'B8', 'C8', 'D8', 'E8'],
['A9', 'B9', 'C9', 'D9', 'E9'],
['A10', 'B10', 'C10', 'D10', 'E10'],
['A11', 'B11', 'C11', 'D11', 'E11'],
['A12', 'B12', 'C12', 'D12', 'E12'],
],
height: 'auto',
colHeaders: true,
rowHeaders: true,
// enable the `HiddenRows` plugin
hiddenRows: {
rows: [3, 5, 9],
// show UI indicators to mark hidden rows
indicators: true,
},
autoWrapRow: true,
autoWrapCol: true,
});

Set up row hiding

To set up your row hiding configuration, follow the steps below.

  1. Specify rows hidden by default

    To both enable row hiding and specify rows hidden by default, set the hiddenRows configuration option to an object.

    In the object, add a rows property, and set it to an array of row indexes.

    Now, those rows are hidden by default:

    JavaScript
    import Handsontable from 'handsontable/base';
    import { registerAllModules } from 'handsontable/registry';
    // Register all Handsontable's modules.
    registerAllModules();
    const container = document.querySelector('#example2');
    new Handsontable(container, {
    licenseKey: 'non-commercial-and-evaluation',
    data: [
    ['A1', 'B1', 'C1', 'D1', 'E1'],
    ['A2', 'B2', 'C2', 'D2', 'E2'],
    ['A3', 'B3', 'C3', 'D3', 'E3'],
    ['A4', 'B4', 'C4', 'D4', 'E4'],
    ['A5', 'B5', 'C5', 'D5', 'E5'],
    ['A6', 'B6', 'C6', 'D6', 'E6'],
    ['A7', 'B7', 'C7', 'D7', 'E7'],
    ['A8', 'B8', 'C8', 'D8', 'E8'],
    ['A9', 'B9', 'C9', 'D9', 'E9'],
    ['A10', 'B10', 'C10', 'D10', 'E10'],
    ['A11', 'B11', 'C11', 'D11', 'E11'],
    ['A12', 'B12', 'C12', 'D12', 'E12'],
    ],
    height: 'auto',
    colHeaders: true,
    rowHeaders: true,
    // enable the `HiddenRows` plugin
    hiddenRows: {
    // specify rows hidden by default
    rows: [3, 5, 9],
    },
    autoWrapRow: true,
    autoWrapCol: true,
    });
    TypeScript
    import Handsontable from 'handsontable/base';
    import { registerAllModules } from 'handsontable/registry';
    // Register all Handsontable's modules.
    registerAllModules();
    const container = document.querySelector('#example2')!;
    new Handsontable(container, {
    licenseKey: 'non-commercial-and-evaluation',
    data: [
    ['A1', 'B1', 'C1', 'D1', 'E1'],
    ['A2', 'B2', 'C2', 'D2', 'E2'],
    ['A3', 'B3', 'C3', 'D3', 'E3'],
    ['A4', 'B4', 'C4', 'D4', 'E4'],
    ['A5', 'B5', 'C5', 'D5', 'E5'],
    ['A6', 'B6', 'C6', 'D6', 'E6'],
    ['A7', 'B7', 'C7', 'D7', 'E7'],
    ['A8', 'B8', 'C8', 'D8', 'E8'],
    ['A9', 'B9', 'C9', 'D9', 'E9'],
    ['A10', 'B10', 'C10', 'D10', 'E10'],
    ['A11', 'B11', 'C11', 'D11', 'E11'],
    ['A12', 'B12', 'C12', 'D12', 'E12'],
    ],
    height: 'auto',
    colHeaders: true,
    rowHeaders: true,
    // enable the `HiddenRows` plugin
    hiddenRows: {
    // specify rows hidden by default
    rows: [3, 5, 9],
    },
    autoWrapRow: true,
    autoWrapCol: true,
    });
  2. Show UI indicators

    To easily see which rows are currently hidden, display UI indicators.

    To enable the UI indicators, in the hiddenRows object, set the indicators property to true:

    JavaScript
    import Handsontable from 'handsontable/base';
    import { registerAllModules } from 'handsontable/registry';
    // Register all Handsontable's modules.
    registerAllModules();
    const container = document.querySelector('#example3');
    new Handsontable(container, {
    licenseKey: 'non-commercial-and-evaluation',
    data: [
    ['A1', 'B1', 'C1', 'D1', 'E1'],
    ['A2', 'B2', 'C2', 'D2', 'E2'],
    ['A3', 'B3', 'C3', 'D3', 'E3'],
    ['A4', 'B4', 'C4', 'D4', 'E4'],
    ['A5', 'B5', 'C5', 'D5', 'E5'],
    ['A6', 'B6', 'C6', 'D6', 'E6'],
    ['A7', 'B7', 'C7', 'D7', 'E7'],
    ['A8', 'B8', 'C8', 'D8', 'E8'],
    ['A9', 'B9', 'C9', 'D9', 'E9'],
    ['A10', 'B10', 'C10', 'D10', 'E10'],
    ['A11', 'B11', 'C11', 'D11', 'E11'],
    ['A12', 'B12', 'C12', 'D12', 'E12'],
    ],
    height: 'auto',
    colHeaders: true,
    rowHeaders: true,
    hiddenRows: {
    rows: [3, 5, 9],
    // show UI indicators to mark hidden rows
    indicators: true,
    },
    autoWrapRow: true,
    autoWrapCol: true,
    });
    TypeScript
    import Handsontable from 'handsontable/base';
    import { registerAllModules } from 'handsontable/registry';
    // Register all Handsontable's modules.
    registerAllModules();
    const container = document.querySelector('#example3')!;
    new Handsontable(container, {
    licenseKey: 'non-commercial-and-evaluation',
    data: [
    ['A1', 'B1', 'C1', 'D1', 'E1'],
    ['A2', 'B2', 'C2', 'D2', 'E2'],
    ['A3', 'B3', 'C3', 'D3', 'E3'],
    ['A4', 'B4', 'C4', 'D4', 'E4'],
    ['A5', 'B5', 'C5', 'D5', 'E5'],
    ['A6', 'B6', 'C6', 'D6', 'E6'],
    ['A7', 'B7', 'C7', 'D7', 'E7'],
    ['A8', 'B8', 'C8', 'D8', 'E8'],
    ['A9', 'B9', 'C9', 'D9', 'E9'],
    ['A10', 'B10', 'C10', 'D10', 'E10'],
    ['A11', 'B11', 'C11', 'D11', 'E11'],
    ['A12', 'B12', 'C12', 'D12', 'E12'],
    ],
    height: 'auto',
    colHeaders: true,
    rowHeaders: true,
    hiddenRows: {
    rows: [3, 5, 9],
    // show UI indicators to mark hidden rows
    indicators: true,
    },
    autoWrapRow: true,
    autoWrapCol: true,
    });
  3. Set up context menu items

    To easily hide and unhide rows, add row hiding items to Handsontable’s context menu.

    Enable both the ContextMenu plugin and the HiddenRows plugin. Now, the context menu automatically displays additional items for hiding and unhiding rows.

    JavaScript
    import Handsontable from 'handsontable/base';
    import { registerAllModules } from 'handsontable/registry';
    // Register all Handsontable's modules.
    registerAllModules();
    const container = document.querySelector('#example4');
    new Handsontable(container, {
    licenseKey: 'non-commercial-and-evaluation',
    data: [
    ['A1', 'B1', 'C1', 'D1', 'E1'],
    ['A2', 'B2', 'C2', 'D2', 'E2'],
    ['A3', 'B3', 'C3', 'D3', 'E3'],
    ['A4', 'B4', 'C4', 'D4', 'E4'],
    ['A5', 'B5', 'C5', 'D5', 'E5'],
    ['A6', 'B6', 'C6', 'D6', 'E6'],
    ['A7', 'B7', 'C7', 'D7', 'E7'],
    ['A8', 'B8', 'C8', 'D8', 'E8'],
    ['A9', 'B9', 'C9', 'D9', 'E9'],
    ['A10', 'B10', 'C10', 'D10', 'E10'],
    ['A11', 'B11', 'C11', 'D11', 'E11'],
    ['A12', 'B12', 'C12', 'D12', 'E12'],
    ],
    height: 'auto',
    colHeaders: true,
    rowHeaders: true,
    // enable the context menu
    contextMenu: true,
    // enable the `HiddenRows` plugin
    // automatically adds the context menu's row hiding items
    hiddenRows: {
    rows: [3, 5, 9],
    indicators: true,
    },
    autoWrapRow: true,
    autoWrapCol: true,
    });
    TypeScript
    import Handsontable from 'handsontable/base';
    import { registerAllModules } from 'handsontable/registry';
    // Register all Handsontable's modules.
    registerAllModules();
    const container = document.querySelector('#example4')!;
    new Handsontable(container, {
    licenseKey: 'non-commercial-and-evaluation',
    data: [
    ['A1', 'B1', 'C1', 'D1', 'E1'],
    ['A2', 'B2', 'C2', 'D2', 'E2'],
    ['A3', 'B3', 'C3', 'D3', 'E3'],
    ['A4', 'B4', 'C4', 'D4', 'E4'],
    ['A5', 'B5', 'C5', 'D5', 'E5'],
    ['A6', 'B6', 'C6', 'D6', 'E6'],
    ['A7', 'B7', 'C7', 'D7', 'E7'],
    ['A8', 'B8', 'C8', 'D8', 'E8'],
    ['A9', 'B9', 'C9', 'D9', 'E9'],
    ['A10', 'B10', 'C10', 'D10', 'E10'],
    ['A11', 'B11', 'C11', 'D11', 'E11'],
    ['A12', 'B12', 'C12', 'D12', 'E12'],
    ],
    height: 'auto',
    colHeaders: true,
    rowHeaders: true,
    // enable the context menu
    contextMenu: true,
    // enable the `HiddenRows` plugin
    // automatically adds the context menu's row hiding items
    hiddenRows: {
    rows: [3, 5, 9],
    indicators: true,
    },
    autoWrapRow: true,
    autoWrapCol: true,
    });

    You can also add the row hiding menu items individually, by adding the hidden_rows_show and hidden_rows_hide strings to the contextMenu parameter:

    JavaScript
    import Handsontable from 'handsontable/base';
    import { registerAllModules } from 'handsontable/registry';
    // Register all Handsontable's modules.
    registerAllModules();
    const container = document.querySelector('#example5');
    new Handsontable(container, {
    licenseKey: 'non-commercial-and-evaluation',
    data: [
    ['A1', 'B1', 'C1', 'D1', 'E1'],
    ['A2', 'B2', 'C2', 'D2', 'E2'],
    ['A3', 'B3', 'C3', 'D3', 'E3'],
    ['A4', 'B4', 'C4', 'D4', 'E4'],
    ['A5', 'B5', 'C5', 'D5', 'E5'],
    ['A6', 'B6', 'C6', 'D6', 'E6'],
    ['A7', 'B7', 'C7', 'D7', 'E7'],
    ['A8', 'B8', 'C8', 'D8', 'E8'],
    ['A9', 'B9', 'C9', 'D9', 'E9'],
    ['A10', 'B10', 'C10', 'D10', 'E10'],
    ['A11', 'B11', 'C11', 'D11', 'E11'],
    ['A12', 'B12', 'C12', 'D12', 'E12'],
    ],
    height: 'auto',
    colHeaders: true,
    rowHeaders: true,
    // individually add row hiding context menu items
    contextMenu: ['hidden_rows_show', 'hidden_rows_hide'],
    hiddenRows: {
    rows: [3, 5, 9],
    indicators: true,
    },
    autoWrapRow: true,
    autoWrapCol: true,
    });
    TypeScript
    import Handsontable from 'handsontable/base';
    import { registerAllModules } from 'handsontable/registry';
    // Register all Handsontable's modules.
    registerAllModules();
    const container = document.querySelector('#example5')!;
    new Handsontable(container, {
    licenseKey: 'non-commercial-and-evaluation',
    data: [
    ['A1', 'B1', 'C1', 'D1', 'E1'],
    ['A2', 'B2', 'C2', 'D2', 'E2'],
    ['A3', 'B3', 'C3', 'D3', 'E3'],
    ['A4', 'B4', 'C4', 'D4', 'E4'],
    ['A5', 'B5', 'C5', 'D5', 'E5'],
    ['A6', 'B6', 'C6', 'D6', 'E6'],
    ['A7', 'B7', 'C7', 'D7', 'E7'],
    ['A8', 'B8', 'C8', 'D8', 'E8'],
    ['A9', 'B9', 'C9', 'D9', 'E9'],
    ['A10', 'B10', 'C10', 'D10', 'E10'],
    ['A11', 'B11', 'C11', 'D11', 'E11'],
    ['A12', 'B12', 'C12', 'D12', 'E12'],
    ],
    height: 'auto',
    colHeaders: true,
    rowHeaders: true,
    // individually add row hiding context menu items
    contextMenu: ['hidden_rows_show', 'hidden_rows_hide'],
    hiddenRows: {
    rows: [3, 5, 9],
    indicators: true,
    },
    autoWrapRow: true,
    autoWrapCol: true,
    });
  4. Set up copy and paste behavior

    By default, hidden rows are included in copying and pasting.

    To exclude hidden rows from copying and pasting, in the hiddenRows object, set the copyPasteEnabled property to false:

    JavaScript
    import Handsontable from 'handsontable/base';
    import { registerAllModules } from 'handsontable/registry';
    // Register all Handsontable's modules.
    registerAllModules();
    const container = document.querySelector('#example6');
    new Handsontable(container, {
    licenseKey: 'non-commercial-and-evaluation',
    data: [
    ['A1', 'B1', 'C1', 'D1', 'E1'],
    ['A2', 'B2', 'C2', 'D2', 'E2'],
    ['A3', 'B3', 'C3', 'D3', 'E3'],
    ['A4', 'B4', 'C4', 'D4', 'E4'],
    ['A5', 'B5', 'C5', 'D5', 'E5'],
    ['A6', 'B6', 'C6', 'D6', 'E6'],
    ['A7', 'B7', 'C7', 'D7', 'E7'],
    ['A8', 'B8', 'C8', 'D8', 'E8'],
    ['A9', 'B9', 'C9', 'D9', 'E9'],
    ['A10', 'B10', 'C10', 'D10', 'E10'],
    ['A11', 'B11', 'C11', 'D11', 'E11'],
    ['A12', 'B12', 'C12', 'D12', 'E12'],
    ],
    height: 'auto',
    colHeaders: true,
    rowHeaders: true,
    contextMenu: ['hidden_rows_show', 'hidden_rows_hide'],
    hiddenRows: {
    rows: [3, 5, 9],
    indicators: true,
    // exclude hidden rows from copying and pasting
    copyPasteEnabled: false,
    },
    autoWrapRow: true,
    autoWrapCol: true,
    });
    TypeScript
    import Handsontable from 'handsontable/base';
    import { registerAllModules } from 'handsontable/registry';
    // Register all Handsontable's modules.
    registerAllModules();
    const container = document.querySelector('#example6')!;
    new Handsontable(container, {
    licenseKey: 'non-commercial-and-evaluation',
    data: [
    ['A1', 'B1', 'C1', 'D1', 'E1'],
    ['A2', 'B2', 'C2', 'D2', 'E2'],
    ['A3', 'B3', 'C3', 'D3', 'E3'],
    ['A4', 'B4', 'C4', 'D4', 'E4'],
    ['A5', 'B5', 'C5', 'D5', 'E5'],
    ['A6', 'B6', 'C6', 'D6', 'E6'],
    ['A7', 'B7', 'C7', 'D7', 'E7'],
    ['A8', 'B8', 'C8', 'D8', 'E8'],
    ['A9', 'B9', 'C9', 'D9', 'E9'],
    ['A10', 'B10', 'C10', 'D10', 'E10'],
    ['A11', 'B11', 'C11', 'D11', 'E11'],
    ['A12', 'B12', 'C12', 'D12', 'E12'],
    ],
    height: 'auto',
    colHeaders: true,
    rowHeaders: true,
    contextMenu: ['hidden_rows_show', 'hidden_rows_hide'],
    hiddenRows: {
    rows: [3, 5, 9],
    indicators: true,
    // exclude hidden rows from copying and pasting
    copyPasteEnabled: false,
    },
    autoWrapRow: true,
    autoWrapCol: true,
    });

Row hiding API methods

For the most popular row hiding tasks, use the API methods below.

To see your changes, re-render your Handsontable instance with the render() method.

Access the HiddenRows plugin instance

To access the HiddenRows plugin instance, use the getPlugin() method:

const plugin = hot.getPlugin('hiddenRows');

Hide a single row

To hide a single row, use the hideRow() method:

const plugin = hot.getPlugin('hiddenRows');
plugin.hideRow(4);

Hide multiple rows

To hide multiple rows:

  • Either pass row indexes as arguments to the hideRow() method
  • Or pass an array of row indexes to the hideRows() method
const plugin = hot.getPlugin('hiddenRows');
plugin.hideRow(0, 4, 6);
// or
plugin.hideRows([0, 4, 6]);

Unhide a single row

To unhide a single row, use the showRow() method:

const plugin = hot.getPlugin('hiddenRows');
plugin.showRow(4);

Unhide multiple rows

To unhide multiple rows:

  • Either pass row indexes as arguments to the showRow() method
  • Or pass an array of row indexes to the showRows() method
const plugin = hot.getPlugin('hiddenRows');
plugin.showRow(0, 4, 6);
// or
plugin.showRows([0, 4, 6]);

Configuration options

Hooks

Plugins