Skip to content

Commit d44b7b5

Browse files
authored
Merge pull request #3662 from VisActor/3661-bug-renderchartasync-setrecords-renderError
3661 bug renderchartasync setrecords render error
2 parents ea2e077 + 877609e commit d44b7b5

6 files changed

Lines changed: 35 additions & 5 deletions

File tree

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"changes": [
3+
{
4+
"comment": "fix: when set renderChartAsync setRecords api render error #3661\n\n",
5+
"type": "none",
6+
"packageName": "@visactor/vtable"
7+
}
8+
],
9+
"packageName": "@visactor/vtable",
10+
"email": "892739385@qq.com"
11+
}

packages/vtable/src/ListTable.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import {
5555
} from './core/record-helper';
5656
import type { IListTreeStickCellPlugin, ListTreeStickCellPlugin } from './plugins/list-tree-stick-cell';
5757
import { fixUpdateRowRange } from './tools/update-row';
58+
import { clearChartRenderQueue } from './scenegraph/graphic/contributions/chart-render-helper';
5859
// import {
5960
// registerAxis,
6061
// registerEmptyTip,
@@ -1158,6 +1159,7 @@ export class ListTable extends BaseTable implements ListTableAPI {
11581159
* @param option 附近参数,其中的sortState为排序状态,如果设置null 将清除目前的排序状态
11591160
*/
11601161
setRecords(records: Array<any>, option?: { sortState?: SortState | SortState[] | null }): void {
1162+
clearChartRenderQueue();
11611163
// 释放事件 及 对象
11621164
this.internalProps.dataSource?.release();
11631165
// 过滤掉dataSource的引用

packages/vtable/src/PivotChart.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ import {
7373
registerVideoCell
7474
} from './scenegraph/group-creater/cell-type';
7575
import { hasLinearAxis } from './layout/chart-helper/get-axis-config';
76-
import { cacheStageCanvas } from './scenegraph/graphic/contributions/chart-render-helper';
76+
import { cacheStageCanvas, clearChartRenderQueue } from './scenegraph/graphic/contributions/chart-render-helper';
7777

7878
registerAxis();
7979
registerEmptyTip();
@@ -1529,6 +1529,8 @@ export class PivotChart extends BaseTable implements PivotChartAPI {
15291529
* @param sort
15301530
*/
15311531
setRecords(records: Array<any>): void {
1532+
this.internalProps.layoutMap.release();
1533+
clearChartRenderQueue();
15321534
const oldHoverState = { col: this.stateManager.hover.cellPos.col, row: this.stateManager.hover.cellPos.row };
15331535
this.options.records = this.internalProps.records = records;
15341536
const options = this.options;

packages/vtable/src/PivotTable.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import {
5353
import type { IEmptyTipComponent } from './components/empty-tip/empty-tip';
5454
import { Factory } from './core/factory';
5555
import { callUpdateColOnScenegraph, callUpdateRowOnScenegraph } from './tools/diff-cell';
56+
import { clearChartRenderQueue } from './scenegraph/graphic/contributions/chart-render-helper';
5657

5758
export class PivotTable extends BaseTable implements PivotTableAPI {
5859
layoutNodeId: { seqId: number } = { seqId: 0 };
@@ -1697,6 +1698,7 @@ export class PivotTable extends BaseTable implements PivotTableAPI {
16971698
* @param sort
16981699
*/
16991700
setRecords(records: Array<any>): void {
1701+
clearChartRenderQueue();
17001702
const oldHoverState = { col: this.stateManager.hover.cellPos.col, row: this.stateManager.hover.cellPos.row };
17011703
this.options.records = this.internalProps.records = records;
17021704
this.internalProps.recordsIsTwoDimensionalArray = false;

packages/vtable/src/core/BaseTable.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,11 @@ import type { CreateLegend } from '../components/legend/create-legend';
121121
import type { DataSet } from '@visactor/vdataset';
122122
import { Title } from '../components/title/title';
123123
import type { Chart } from '../scenegraph/graphic/chart';
124-
import { setBatchRenderChartCount } from '../scenegraph/graphic/contributions/chart-render-helper';
124+
import {
125+
chartRenderQueueList,
126+
clearChartRenderQueue,
127+
setBatchRenderChartCount
128+
} from '../scenegraph/graphic/contributions/chart-render-helper';
125129
import { isLeftOrRightAxis, isTopOrBottomAxis } from '../layout/chart-helper/get-axis-config';
126130
import { NumberRangeMap } from '../layout/row-height-map';
127131
import { ListTable } from '../ListTable';
@@ -2316,6 +2320,7 @@ export abstract class BaseTable extends EventTarget implements BaseTableAPI {
23162320
this.internalProps = null;
23172321

23182322
this.reactCustomLayout?.clearCache();
2323+
clearChartRenderQueue();
23192324
}
23202325

23212326
fireListeners<TYPE extends keyof TableEventHandlersEventArgumentMap>(
@@ -2486,6 +2491,7 @@ export abstract class BaseTable extends EventTarget implements BaseTableAPI {
24862491
internalProps.emptyTip?.release();
24872492
internalProps.emptyTip = null;
24882493
internalProps.layoutMap.release();
2494+
clearChartRenderQueue();
24892495
this.scenegraph.clearCells();
24902496
this.scenegraph.updateComponent();
24912497
this.stateManager.updateOptionSetState();

packages/vtable/src/scenegraph/graphic/contributions/chart-render-helper.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,26 @@ import type { IAABBBounds } from '@visactor/vutils';
44
import { Bounds, isValid } from '@visactor/vutils';
55
import type { BaseTableAPI } from '../../../ts-types/base-table';
66
export const cancelRenderChartQueue = false;
7-
export const chartRenderKeys: string[] = [];
8-
export const chartRenderQueueList: Chart[] = [];
7+
export let chartRenderKeys: string[] = [];
8+
export let chartRenderQueueList: Chart[] = [];
99
interface chartRenderQueueItem {
1010
chart: Chart;
1111
}
1212
//每次消费的图表数量
1313
let batchRenderChartCount = 5;
1414
let isHandlingChartQueue = false;
15+
let requestAnimationFrameId: number;
1516
export function setBatchRenderChartCount(count: number) {
1617
if (isValid(count)) {
1718
batchRenderChartCount = count;
1819
}
1920
}
21+
export function clearChartRenderQueue() {
22+
chartRenderKeys = [];
23+
chartRenderQueueList = [];
24+
isHandlingChartQueue = false;
25+
cancelAnimationFrame(requestAnimationFrameId);
26+
}
2027
export function IsHandlingChartQueue() {
2128
return isHandlingChartQueue;
2229
}
@@ -175,7 +182,7 @@ export function startRenderChartQueue(table: any) {
175182
if (chartRenderQueueList.length > 0) {
176183
// 使用 requestAnimationFrame 或 setTimeout 来调度下一批图表的渲染
177184
// requestAnimationFrame(() => renderChartQueue(table));
178-
requestAnimationFrame(() => {
185+
requestAnimationFrameId = requestAnimationFrame(() => {
179186
// 从集合中获取要渲染的图表上下文
180187
const chartsToRender = chartRenderQueueList.splice(0, batchRenderChartCount);
181188
chartRenderKeys.splice(0, batchRenderChartCount);

0 commit comments

Comments
 (0)