某天疯狂渲染地图组件,大概17次来回切换,屏幕重新渲染地图,最终它还是没能扛下所有,不幸崩塌。
分析可能的原因:
1、由于L7地图画布一直累加在页面上,old context 无法回溯更新,“新的来了,旧的依旧不去”,最后导致画布丢失。
解决方案:重新渲染新的地图画布之前,将上一次画布销毁,直接用的destroy()方法。
结果:重新渲染的时候看着是很丝滑,看上去旧的画布已经销毁不复还,再次试验发现10余次渲染之后又爆红报错了。
2、查看dom节点,发现地图组件是销毁了,它的底图(图上白色背景的)依旧保留,无数个canvas节点堆积如山。
解决方案:通过官方提供的destory()没办法解决这个bug,只能换一种思路。每次重新渲染地图画布,无非是想把新的数据灌进去再进行渲染,那我们就只画一个地图画布,接下来的操作,只更新数据,不更新画布。
updateData(layer: DRILL_LEVEL, newData: Array<{
[key: string]: any;
}>, joinByField?: [string, string]): void;
核心代码 : updateData()
import React, {
useEffect, useState } from 'react';
import {
Scene, Control } from '@antv/l7';
import {
DrillDownLayer } from '@antv/l7-district';
import {
Mapbox } from '@antv/l7-maps';
import {
getAccountMapList } from '../../../../../services/map/api';
import moment from 'moment';
import '../index.css';
import {
format } from '../../utils';
import {
Spin } from 'antd';
let drillLayer: DrillDownLayer;
interface MapProps {
selectTime: any;
isDay: any;
}
const Map: React.FC<MapProps> = (props: any) => {
const {
selectTime, isDay } = props;
const [loading, setLoading] = useState(false);
let areaName = '' as any;
let provinceData = [] as any;
let cityDatas = [] as any;
useEffect(() => {
const scene = new Scene({
id: 'mapWarning',
map: new Mapbox({
center: [116.2825, 39.9],
pitch: 0,
style: 'blank',
zoom: 3,