Aggrid RowModel

1,025 阅读3分钟

什么是RowModel

RowModel是aggrid用来加载数据的模型,不同模式,拥有不同的数据结构和方法, aggrid拥有4不同类型的RowModel;

  1. client-side
  2. server-side
  3. infinite
  4. viewport

4种模式对应不同的数据加载策略,通过rowModelType字段来进行控制,指定Id,4种模型都可以通过getRowId方法来指定;

client-side

一次性加载所有数据,根据官方数据,一次最多可以加载100k+行的数据,数据模型

该Model默认会使用虚拟列表,仅渲染可是区域内的数据,由此来保证,页面不会卡顿;

server-side

从服务端获取数据,默认用户滚动,会加载更多数据,比infinite支持更多功能,数据模型

该Model从服务端lazy-load数据,具体有以下两种策略:
1.如果有group,会在展开的时候,才加载group的child;
2.默认加载一屏数据,滚动才加载更多;

infinite

从服务端获取数据,默认用户滚动,会加载更多数据,数据模型

viewport

从服务端获取数据,和服务器交互当前用户正在看的内容,数据模型
四种模式,支持的功能不同,以下可以看到不同的点:
www.ag-grid.com/javascript-…
总体来说,client-side和server-side支持的功能基本相同,除了quick-filter和header selection不支持,其他都一样,通常将后端分页使用server-side,前端分页使用client-side模式

RowModel的使用

获取当前的model

使用gridRef.current.api.getModel()可以获取到当前table使用rowModel
从这里可以看到原始行、已应用筛选器后的行、已应用聚合后的行以及最后一组“要显示”的行

image.png

RowModel原理

RowModel遵循MVC原则;

image.png 从图上可以看出,1个row renderer 对应 1个pagination Proxy,对应1个row model,1个row model中包含n个row node;不同的rowModel拥有不同的数据结构和方法,但是都共同拥有4个方法,rowModelUpdated事件发出后,rowRenderer会进行refeshView

RowNode

更新

不同的rowModel,需要有不同的方式来更新view,默认是使用gridApi或者使用数据驱动,直接更改数据,grid有change detection,只要通过grid api更新了数据,会自动同步到对应的value上去; 但是如果更改了外部数据,但是grid的数据未同步,此时需要手动调用api;即使用通用方法

server-side

在client-side model模式下,有3种更新方式:

  1. 使用refreshServerSide(params) 指定当前grid开始刷新所有已经load的数据,支持根据传参不同,刷新不同级别路径的数据,不穿默认parent,传递path可以指定group/tree级别的数据

  2. 使用rowNode.setData和rowNode.updateData

  3. 使用transaction
    applyServerSideTransaction

client-side

在client-side model模式下,有4种更新方式:

  1. 直接设置rowData
    直接修改数据源,如果使用react,可以直接将rowData设置为state,更改即可,如果使用aggridapi,可以使用api.setRowData(newData)来进行update
    对filters等功能的影响不明;
  2. 使用RowNode API
    rowNode.setData(data):设置data属性,会更新整行数据
    rowNode.setDataValue(col,value):设置value属性,仅更新当前cell
  3. 使用gridApi.applyTransaction(transaction)
    使用于需要批量数据更新,会将transaction batch设置到界面上,transaction即为
function applyTransaction(rowDataTransaction: RowDataTransaction<TData>): RowNodeTransaction<TData> | null | undefined;
interface RowDataTransaction<TData = any> {
    // Index to add rows 
    addIndex?: number | null;
    // Rows to add 
    add?: TData[] | null; // Rows to remove 
    remove?: TData[] | null; // Rows to update 
    update?: TData[] | null;
}
interface RowNodeTransaction<TData = any> { // Row nodes added 
    add: [IRowNode]// (https://www.ag-grid.com/javascript-data-grid/row-object/)<TData>[]; // Row nodes removed 
    remove: [IRowNode]// (https://www.ag-grid.com/javascript-data-grid/row-object/)<TData>[]; // Row nodes updated 
    update: [IRowNode]// (https://www.ag-grid.com/javascript-data-grid/row-object/)<TData>[]; 
}
  1. 使用api.applyTransactionAsync(transaction)
    适用于高频修改的场景,异步修改,会将transaction进行任务划分到更细的时间执行

view refresh方法

更改了外部数据,但是grid的数据未同步
1.api.refreshCells(cellParams) 仅刷新ui上的value和实际模型上value不同的cell,对传入的cell进行change detection,不传默认检测所有cell,按需刷新 2.api.redrawRows(redrawRowsParams) remove 指定row的dom,并且重新绘制该row,开销更大,尽量使用refreshCells完成