for循环 绘制Echarts图表之后,点击 添加图表向前插入图表遇到实例未更新

news/2024/9/25 11:13:21/

一、问题及预期

for循环 绘制图表之后,点击 添加图表, 应该展示空表的初始状态,但是展示的是上一个图表正常有数据的图表

二、复盘

  1. 采用index 作为下标去渲染图表实例
  2. 导致点击【添加图表】按钮的时候向前添加的下标为0 ,和原来存在为0的下标实例重复,从而导致会展示【上一个图表正常有数据的图表】
  3. 不使用index作为图表实例渲染,采用随机数或者是时间戳去做绘制图表
  4. 新增的数据会初始展示空表 【正确】
  5. 新增的数据点击查询正常出现图表 【正确】

三、案例代码

为了确保点击“添加新图表”后,新图表展示为空白的初始状态,同时之前的图表展示正常有数据的状态,你需要在addNewChart方法中正确初始化新图表,并保证不影响已有图表的状态。以下是修改后的addNewChart方法,以及相关的初始化图表的逻辑:

  1. 修改addNewChart方法:确保添加新图表时,不会影响到已有图表的显示。
private addNewChart() {const timestamp = new Date().getTime(); // 使用时间戳生成唯一标识const obj = {formCustom: {groupField: '',calculateField: 'requestId',granularity: 60,},name: '',chartType: 1,isCollect: false,isInitChart: false,cardItemId: `${timestamp}`, // 为每个图表卡片分配一个唯一IDtableData: [], // 确保新图表的数据为空chartTableData: [], // 确保新图表的数据为空numberTotal: 0, // 对于数字类型的图表,初始化总数为0};this.chartCardList.unshift(obj); // 将新图表添加到数组的开头this.$nextTick(() => {this.initChartInstances(); // 初始化图表实例});
}
  1. 初始化图表实例:在添加新图表后,你需要重新初始化所有图表的实例,以确保新添加的图表能够正确显示。这里我们添加一个initChartInstances方法来处理这个逻辑。
private initChartInstances() {this.chartCardList.forEach((cardItem, index) => {if (cardItem.chartType !== 1 && cardItem.chartType !== 2) { // 假设只有类型3, 4, 5, 6需要初始化图表const chartRef = this.$refs[`chart_${cardItem.cardItemId || cardItem.formCustom.id}`];const chartDom = Array.isArray(chartRef) ? chartRef[0] : chartRef;if (chartDom) {this.initChart(chartDom, cardItem.cardItemId, cardItem.chartType, cardItem.chartTableData);}}});
}
  1. 调整initChartHandle方法:确保initChartHandle方法能够正确处理新添加的图表卡片。
private initChartHandle(cardItem: any, resRows: any, cardItemId: number) {// 你的原始逻辑...this.$nextTick(() => {this.initChartInstances(); // 确保在DOM更新后重新初始化图表实例});
}

通过上述修改,每次添加新图表时,都会重新初始化所有图表的实例,确保新添加的图表展示为空白的初始状态,而不会影响到已有图表的显示。请注意,这里的initChartInstances方法假设只有特定类型的图表需要初始化ECharts实例,你可能需要根据实际情况调整这部分逻辑。

四、实例案例

  <mtd-cardclass="card-box"v-for="(cardItem, index) in chartCardList":key="cardItem.cardItemId"><div:ref="`chart_${cardItem.cardItemId || cardItem.formCustom.id}`"class="chart-box"></div>
</mtd-card>
 private chartInstances: any = [];private addNewChart() {const timestamp = new Date().getTime(); // 使用时间戳生成唯一标识const obj = {formCustom: {groupField: '',calculateField: 'requestId',granularity: 60,},name: '',chartType: 1,isCollect: false,cardItemId: `${timestamp}`, // 为每个图表卡片分配一个唯一ID};this.chartCardList.unshift(obj);this.$nextTick(() => {this.initChartInstances(); // 初始化图表实例});}// 初始化图表实例private initChartInstances() {this.chartCardList.forEach((cardItem: any) => {if (cardItem.chartType !== 1 && cardItem.chartType !== 2) {// 类型3, 4, 5, 6需要初始化图表const chartRef =this.$refs[`chart_${cardItem.cardItemId || cardItem.formCustom.id}`];const chartDom = Array.isArray(chartRef) ? chartRef[0] : chartRef;if (chartDom) {this.initChart(chartDom,cardItem.cardItemId,cardItem.chartType,cardItem.chartTableData,);}}});}private initChartHandle(cardItem: any, resRows: any) {// 获取新添加的DOM元素并初始化图表this.$nextTick(() => {const chartRef =this.$refs[`chart_${cardItem.cardItemId || cardItem.formCustom.id}`];const chartDom = Array.isArray(chartRef)? (chartRef[0] as Element): null;if (chartDom) {this.initChart(chartDom,cardItem.cardItemId,cardItem.chartType,resRows,);}});}private initChart(dom: any,index: number,chartType: number,resRows: SearchPicTableType[],) {const myChart = echarts.init(dom);const option = switchChart(chartType, resRows);myChart.setOption(option, true);// 存储ECharts实例以便后续更新this.chartInstances[index] = myChart;}

http://www.ppmy.cn/news/1470368.html

相关文章

Android入门第68天-自动更新/升级怎么做(生产级实例)

开篇 今天我们进入第68讲。 在第60天左右其实很多同学们已经进入了APP应用开发了,因为60天内容足以让大家踏上正实的Android开发生涯。 随着开发的深入,我们发觉日常工作中无非就是一些组件的嵌套、合理应用。当代码迭代、功能迭代越来越频繁后我们面临着另一个问题,即:…

嵌入式数据库_2.嵌入式数据库的一般架构

嵌入式数据库的架构与应用对象紧密相关&#xff0c;其架构是以内存、文件和网络等三种方式为主。 1.基于内存的数据库系统 基于内存的数据库系统中比较典型的产品是每个McObject公司的eXtremeDB嵌入式数据库&#xff0c;2013年3月推出5.0版&#xff0c;它采用内存数据结构&…

详解 Flink Table API 和 Flink SQL 之时间特性

一、介绍 Table API 和 SQL 进行基于时间的操作&#xff08;比如时间窗口&#xff09;时需要定义相关的时间语义和时间数据来源的信息。因此会给表单独提供一个逻辑上的时间字段&#xff0c;专门用来在表处理程序中指示时间时间属性&#xff08;time attributes&#xff09;&a…

“中国人对AI的态度最为积极”说明什么?

#AI技术服务 #AI智能应用 #AI合同 #合同AI服务 斯坦福大学的AI指数报告指出&#xff1a;“中国人对AI的态度最为积极……” 这一观点应是基于一系列的观察和研究得出的结果。如果这一观点成立&#xff0c;那么它或许说明了以下几个层面的意义: 首先&#xff0c;政策支持与…

【计算机网络】[第4章 网络层][自用]

1 概述 (1)因特网使用的TCP/IP协议体系(四层)的网际层,提供的是无连接、不可靠的数据报服务; (2)ATM、帧中继、X.25的OSI体系(七层)中的网络层,提供的是面向连接的、可靠的虚电路服务。 (3)路由选择分两种: 一种是由用户or管理员人工进行配置(只适用于规…

新人学习笔记之(注释和关键字)

一、注释 1.什么是注释 (1)注释是在程序指定位置添加的说明性信息 (2)简单理解&#xff0c;就是对代码的一种解释 2.注释的分类 (1)单行注释 格式&#xff1a;// 注释信息 (2)多行注释 格式&#xff1a;/*注释信息*/ 3.注释的使用 (1)主要作用&#xff1a;增加代码的阅读性 4.注…

C# —— 类

简介 类;就是具有相同属性和方法的对象集合,例如,人类 动物类型 ADC类等 Array数组类 ArrayList类 List类 字符串类等 类包含又什么东西组成 又什么可执行的操作(方法) 对象; 类的实例化.通俗讲就是类中的其中一个, 例如 哈士奇&#xff0c;鲁班等 a1 a2 a3就是ArrayList中的…

面向对象设计模式准则

一&#xff0c;简介 罗伯特C马丁在 21 世纪早期引入了名为「SOLID」的设计原则&#xff0c;指代了面向对象编程和面向对象设计的五个基本原则&#xff08;也有说六个的&#xff09;&#xff0c;即为 SOLIDD. 单一职责原则&#xff08;Single Responsibility Principle&#x…