Vue Data Grid

Cell Components

vue logo

Custom HTML / DOM inside Cells is achieved using Cell Components. Create Custom Cell Components to have any HTML markup in a cell. The grid comes with some Provided Cell Components for common grid tasks.

The example below shows adding images, hyperlinks, and buttons to a cell using Custom Cell Components.

Custom Components

With Vue 2 and Vue 3 you can access the params object via this.params in the usual methods (lifecycle hooks, methods etc), and with Vue 3's setup via props.params.

  // ...
  beforeMount() {
    this.cellValue = this.params.value;
  }
  // ...

The params (interface ICellRendererParams) passed to the Cell Component are as follows:

Vue 3 - Class Based Components & Typed Components

If you're using a Class Based Component (i.e. you're using vue-property-decorator/vue-class-component), or if you're using a vanilla Vue 3 component with lang='ts' then you'll need to specify the params object as a prop.

For example:

<script lang="ts">
   import {defineComponent} from "vue";

   export default defineComponent({
       name: "MyComponent",
       props: ['params'],  // required for TypeScript ...

Note that if Row Selection is enabled, it is recommended to set suppressKeyboardEvent on the column definition to prevent the ␣ Space key from triggering both row selection and toggling the checkbox.

Provided Components

The grid comes with some Cell Components out of the box. These Provided Cell Components cover common some common complex cell rendering requirements.

Selecting Components

The Cell Component for a Column is set via colDef.cellRenderer and can be any of the following types:

  1. String: The name of a registered Cell Component.*
  2. Function: A function that returns either an HTML string or DOM element for display.

*If referenced by name then the Cell Component must first be registered.

The code snippet below demonstrates each of these method types.

<ag-grid-vue
    :columnDefs="columnDefs"
    /* other grid options ... */>
</ag-grid-vue>

this.columnDefs = [
    // 1 - String - The name of a Cell Component registered with the grid.
    {
        field: 'age',
        cellRenderer: 'agGroupCellRenderer',
    },
    // 2 - Function - A function that returns an HTML string or DOM element for display
    {
        field: 'year',
        cellRenderer: params => {
            // put the value in bold
            return 'Value is <b>' + params.value + '</b>';
        }
    }
];

Dynamic Selection

The colDef.cellRendererSelector function allows setting difference Cell Components for different Rows within a Column.

The params passed to cellRendererSelector are the same as those passed to the Cell Renderer Component. Typically the selector will use this to check the rows contents and choose a renderer accordingly.

The result is an object with component and params to use instead of cellRenderer and cellRendererParams.

This following shows the Selector always returning back a Mood Cell Renderer:

cellRendererSelector: params => {
   return {
       component: 'GenderCellRenderer',
       params: {values: ['Male', 'Female']}
   };
}

However a selector only makes sense when a selection is made. The following demonstrates selecting between Mood and Gender Cell Renderers:

cellRendererSelector: params => {

   const type = params.data.type;

   if (type === 'gender') {
       return {
           component: 'GenderCellRenderer',
           params: {values: ['Male', 'Female']}
       };
   }

   if (type === 'mood') {
       return {
           component: 'MoodCellRenderer'
       };
   }

   return undefined;
}

Here is a full example.

  • The column 'Value' holds data of different types as shown in the column 'Type' (numbers/genders/moods).
  • colDef.cellRendererSelector is a function that selects the renderer based on the row data.
  • The column 'Rendered Value' show the data rendered applying the component and params specified by colDef.cellRendererSelector

Custom Props

The props passed to the Cell Component can be complimented with custom props. This allows configuring reusable Cell Components - e.g. a component could have buttons that are optionally displayed via additional props.

Compliment props to a cell renderer using the Column Definition attribute cellRendererParams. When provided, these props will be merged with the grid provided props.

<template>
    <ag-grid-vue :columnDefs="columnDefs" ...other properties>
    </ag-grid-vue>
</template>

<script>
//...other imports
import {AgGridVue} from "ag-grid-vue3";

// define Cell Component to be reused
const ColourComponent = {
  template: '<span :style="{color: params.color}">{{params.value}}</span>'
};

export default {
 components: {
     AgGridVue,
     ColourComponent
 },
 data() {
     return {
         columnDefs: [
             {
                 headerName: "Colour 1",
                 field: "value",
                 cellRenderer: 'ColourComponent',
                 cellRendererParams: {
                      color: 'guinnessBlack'
                 }
             },
             {
                 headerName: "Colour 2",
                 field: "value",
                 cellRenderer: 'ColourComponent',     
                 cellRendererParams: {
                      color: 'irishGreen'
                 }
             }
         ]
     }
 }
 //...other properties & methods
}
</script>

This example shows rendering an image with and without custom props and using custom props to pass a callback to a button. The Refresh Data button triggers the cell components to refresh by randomising the success data.

Cell Component Function

Instead of using a Vue component, it's possible to use a function for a Cell Component.

This is useful if you have a String value to render and want to avoid the overhead of a Vue component.

In the example below we're outputting a string value that depends on the cell value:

<template>
    <ag-grid-vue :columnDefs="columnDefs" ...other properties>
    </ag-grid-vue>
</template>

<script>
//...other imports
import {AgGridVue} from "ag-grid-vue3";

export default {
 components: {
     AgGridVue
 },
 data() {
     return {
         columnDefs: [
             {
                 headerName: "Value",
                 field: "value",
                 cellRenderer: params => params.value > 1000 ? "LARGE VALUE" : "SMALL VALUE"
             }
         ]
     }
 }
 //...
}
</script>

It is also possible to write a JavaScript-based Cell Component - refer to the docs here for more information

Accessing Instances

After the grid has created an instance of a Cell Component for a cell it is possible to access that instance. This is useful if you want to call a method that you provide on the Cell Component that has nothing to do with the operation of the grid. Accessing Cell Components is done using the grid API getCellRendererInstances(params).

An example of getting the Cell Component for exactly one cell is as follows:

// example - get cell renderer for first row and column 'gold'
const firstRowNode = api.getDisplayedRowAtIndex(0);
const params = { columns: ['gold'], rowNodes: [firstRowNode] };
const instances = api.getCellRendererInstances(params);

if (instances.length > 0) {
   // got it, user must be scrolled so that it exists
   const instance = instances[0];
}

Note that this method will only return instances of the Cell Component that exists. Due to Row and Column Virtualisation, Cell Components will only exist for Cells that are within the viewport of the Vertical and Horizontal scrolls.

The example below demonstrates custom methods on Cell Components called by the application. The following can be noted:

  • The medal columns are all using the user defined MedalCellRenderer. The Cell Component has an arbitrary method medalUserFunction() which prints some data to the console.
  • The Gold method executes a method on all instances of the Cell Component in the gold column.
  • The First Row Gold method executes a method on the gold cell of the first row only. Note that the getCellRendererInstances() method will return nothing if the grid is scrolled far past the first row showing row virtualisation in action.
  • The All Cells method executes a method on all instances of all Cell Components.

Dynamic Tooltips

When working with Custom Cell Renderers it is possible to register custom tooltips that are displayed dynamically by using the setTooltip method.

Properties available on the ICellRendererParams<TData = any, TValue = any, TContext = any> interface.

The example below demonstrates a dynamic tooltip being displayed on Cell Components. The following can be noted:

  • The Athlete column uses the shouldDisplayTooltip callback to only display Tooltips when the text is not fully displayed.