echart legend 的使用及离开界面图表全局销毁

news2024/9/21 0:40:50

 父组件

<template>
  <AbnormalAlarmStatistics ref="abnormalAlarmStatistics" />
</template>
<script setup>
import {
  ref,
  reactive,
  computed,
  onMounted,
  getCurrentInstance,
  watch
} from "vue";

const { proxy } = getCurrentInstance();
const getQualityAnalysisHistory = () => {
  // 异常预警统计
  let warningData = [
    {
      id: 1,
      name: "预警1",
      value: 0,
    },
    {
      id: 2,
      name: "预警2",
      value: 0,
    },
    ...
    {
      id: 40,
      name: "预警40",
      value: 0,
    },
  ];
  proxy.$refs["abnormalAlarmStatistics"].initChart(warningData);
};
onMounted(() => {
  getQualityAnalysisHistory();
});
</script>

子组件

<template>
    <el-card shadow="never" class="statistics">
      <h4>异常报警统计</h4>
      <div ref="chart" class="chart" style="width: 100%; height: 310px;"></div>
    </el-card>
</template>

<script setup>
import { getCurrentInstance, ref } from "vue";
import * as echarts from "echarts";
import { useEcharts } from "@/hooks/useEcharts.js";
/**
 * 初始化值
 */
const { proxy } = getCurrentInstance();
const initChart = (type) => {
  let myChart = echarts.init(proxy.$refs.chart);
  // 图表数据
  const chartData = ref(type);
  //总数
  let sum = chartData.value.reduce((a, b) => {
    return a + b.value;
  }, 0);

  let option = {
    tooltip: {
      trigger: "item",
    },
    legend: [
    {
      icon: "rect",
        top: 20,
        right: '12%',
        itemHeight: 10,
        itemWidth: 10,
        itemGap: 14,
        type: 'scroll',
        orient: "vertical",
        pageIconColor: '#1b9aee', //翻页下一页的三角按钮颜色
        pageIconInactiveColor: '#7f7f7f', //翻页(即翻页到头时)
        data: chartData.value.map((v) => v.name),
        textStyle: {
          rich: {
            uname: {
              color: "#333333",
              fontSize: 14,
              width: 80
            },
            unum: {
              color: "#333333",
              fontWeight: "bold",
              fontSize: 14,
              align: "right",
            },
          },
        },
        formatter(name) {
          let res = chartData.value.filter((v) => v.name == name);
          return `{uname|${name}}{unum|${res[0].value}}`;
        },
      }
    ],
    color: [
      "#0058FF",
      "#D33232",
      "#FFFF02",
      "#FF9402",
      "#00EBFF",
      "#FFC608",
      "#00AF75",
      "#9E46DE",
      "#F06856",
      "#0BB1D0",
    ],
    series: [
      {
        type: "pie",
        radius: [65, 80],
        center: ["30%", "45%"],
        avoidLabelOverlap: false,
        label: {
          normal: {
            show: true,
            position: "center",
            color: "#4c4a4a",
            formatter: "{total|" + sum + "}" + "\n\r" + "{active|报警总数(次)}",
            rich: {
              total: {
                fontSize: 20,
                color: "#333333",
                fontWeight: "bold",
              },
              active: {
                fontSize: 14,
                color: "#333333",
                padding: [7, 0, 0, 0],
              },
            },
          },
          emphasis: {
            //中间文字显示
            show: true,
          },
        },
        labelLine: {
          show: false,
        },
        itemStyle: {
          borderWidth: 0,
          borderColor: "#fff",
        },
        data: chartData.value,
      },
    ],
  };

  useEcharts(myChart, option);
};
defineExpose({ initChart });
</script>
<style lang="scss" scoped>
.statistics {
  height: 364px;
}
</style>

公共方法,用于图表 resize 和 销毁
useEcharts.js

import { onBeforeUnmount, onDeactivated  } from "vue";
// import * as echarts from "echarts";

/**
 * @description 使用 Echarts (只是为了添加图表响应式)
 * @param {Element} myChart Echarts实例 (必传)
 * @param {Object} options 绘制Echarts的参数 (必传)
 * */
// 全局ECharts实例的容器
let globalEChartsInstances = new Set();
export const useEcharts = (myChart, options) => {
  if (options && typeof options === "object") {
    myChart.setOption(options,true);
    globalEChartsInstances.add(myChart);
  }/*  */
  const echartsResize = () => {
    myChart && myChart.resize();
  };

  window.addEventListener("resize", echartsResize);

  // 防止 echarts 页面 keepAlive 时,还在继续监听页面
  onDeactivated(() => {
    window.removeEventListener("resize", echartsResize);
  });
  // onBeforeUnmount(() => {
  //   window.removeEventListener("resize", echartsResize);
  //   myChart.dispose()
  // });
};
// 销毁所有ECharts实例的函数
export const destroyAllECharts = () => {
  globalEChartsInstances.forEach(chart => {
    chart.dispose();
  });
  globalEChartsInstances.clear();
}
//*暴露所有的echarts实例
export default globalEChartsInstances;

全局监听路由变化,销毁图表

router.beforeEach(async (to, from, next) => {
    //*当前路由和跳转路由不一致时,有echarts实例就销毁
    if(to.path !== from.path) {
      if(globalEChartsInstances?.size > 0) destroyAllECharts(); // 当即将离开当前路由时销毁全 
       局ECharts实例
    }
  }
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2073117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS Docker搭建Mysql5.7集群

MySQL Replication MySQL提供了Replication功能&#xff0c;可以实现将一个数据库的数据同步到多台其他数据库。前者通常称之为主库&#xff08;master&#xff09;&#xff0c;后者则被称从库&#xff08;slave&#xff09;。MySQL复制过程采用异步方式&#xff0c;但延时非常…

图解Redis五大数据类型

五种数据类型的不同之处&#xff0c;是value在存储时的形式不同。 hash类型 value类型是<key,value>键值对。如果发生hash冲突&#xff0c;用开放定址法解决&#xff0c;不拉链&#xff01; key值重复&#xff0c;则新值覆盖旧值 List类型 Set类型 与List的类似&…

嵌入式Keil工具【微库】和【标准库】的对比

我们在学习或者用单片机做开发的时候,输出信息以及打印调试基本都会有用的 printf 函数,那么,这个时候基本都会用到【微库】。 如果使用 Keil 软件,就会勾选配置中的微库(MicroLib),如下图: 同样,在IAR、 e2 studio等开发单片机的集成开发环境中,也有类似的配置选项。…

电脑远程监控桌面软件集锦|(2024全网优秀资源整理!)

电脑远程监控桌面软件在企业管理和个人应用中扮演着重要的角色。 这些工具可以帮助企业提升工作效率、保护数据安全&#xff0c;同时也能在个人使用时提供便利。 以下是几款优秀的电脑远程监控桌面软件及其主要功能介绍&#xff1a; 1中科安企 特点&#xff1a;一款备受企业…

2024年第十五届蓝桥杯图形化省赛真题分享包含答案

Scratch初级:8月24日9:30-11:00 Scratch中级:8月24日14:00-15:30 Python:8月25日9:30-11:00 C++:8月25日14:00-15:30 这次考了哪些内容呢,我们来大概看看(编程题没有答案,编程题有,大家可以评论群留言单选题的答案):

智能手机摄影的发展方向全面分析

智能手机摄影技术在过去十年间取得了长足的进步&#xff0c;成为许多消费者购买手机时的主要考量因素。随着硬件和软件技术的不断创新&#xff0c;手机摄影的能力越来越接近甚至在某些方面超越了传统相机。本文将从多个角度分析手机摄影的发展方向&#xff0c;包括硬件、软件、…

2024年【防爆电气】找解析及防爆电气模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 防爆电气找解析考前必练&#xff01;安全生产模拟考试一点通每个月更新防爆电气模拟试题题目及答案&#xff01;多做几遍&#xff0c;其实通过防爆电气理论考试很简单。 1、【单选题】()电气设备没有防爆的外壳和保护…

IDEA中切换jdk的版本(环境配置)

一、问题 二、过程 IDEA切换jdk 电脑中切换jdk 如果改变之后&#xff0c;依然没有变化的情况&#xff0c;可以使用where java命令删除路径为“.\Oracle\Java\javapath\”下的java.exe、javac.exe等三个文件。

【TB作品】MSP430F149单片机,数字时钟万年历程序,滚动显示特效

一、 万年历 任务要求&#xff1a; 制作一个万年历&#xff0c;具有显示时间、日期、温度、湿度、闹钟功能。 1、OLED显示屏上显示日期和时钟&#xff08;显示到秒&#xff0c;时间可走动&#xff09;&#xff1b;&#xff08;20分&#xff09; 2、通过开发板上的温度传感器采集…

Java小白一文简单普及Java中的String关键字

String类 String对象用于保存字符串&#xff0c;也就是一组字符序列 字符串常量对象是用双引号括起的字符序列&#xff0c;例如 “Kerwin” 字符串的字符使用Unicode字符编码&#xff0c;一个字符&#xff08;不区分字母还是汉字&#xff09;占两个字节 String类较常用构造方…

婚宴座位号怎样查?

在婚宴的温馨氛围中&#xff0c;快速准确地找到座位是每位宾客的期待。本文将带您领略如何通过一系列简单步骤&#xff0c;在电脑端和小程序中查询座位号&#xff0c;确保每位宾客都能享受到这场庆典的每一个细节。 第一章&#xff1a;电脑端查询信息上传 1. 官网登录&#x…

基于状态机实现的按键释放、消抖、单击、双击、长按等功能

状态机理论&#xff1a; 每次只能执行状态机中的一个状态 注意&#xff1a;状态转移时有时会根据需要发生不同的动作(可根据不同条件发生不同的动作)&#xff0c;此处的发生动作指返回按键码值&#xff08;代表那个按键的对应状态&#xff09; 如果是在长按状态在向释放状态迁…

分享一个基于python的内蒙古旅游景点数据分析与采集系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

【算法进阶1】贪心算法、背包问题(0-1背包、分数背包)、拼接最大数字问题、活动选择问题

1 贪心算法 2 背包问题 2.1 0-1背包问题 2.2 分数背包 3 拼接最大数字问题 4 活动选择问题 1 贪心算法 贪心算法(又称贪婪算法)是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。 也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;他所做出…

基于虚拟下垂控制的分布式电源并网建模仿真

针对并联逆变器间的环流和功率分配不均的问题&#xff0c;提出了一种基于改进虚拟阻抗的微电网逆变器下垂控制策略&#xff0c;对传统下垂控制算法的有功功率和无功功率进行分析&#xff0c;虚拟阻抗引入到电压电流双环控制策略。 在MATLAB中建立了逆变器并联运行的分布式仿真模…

【Qt】贪吃蛇

目录 贪吃蛇小游戏 一.项目介绍及演示 1. 项目介绍 2. 项目演示 3. 窗口介绍 3.1 游戏大厅窗口 3.2 游戏关卡选择窗口 3.3 游戏房间窗口 二、创建项目及资源配置 1. 创建项目&#xff08;QWidget&#xff09; ​编辑 2. 资源配置&#xff08;图片声音素材&#xff0…

文心快码助力项目实战开发

文章目录 前言支持的编程语言 Language安装方法使用方法 项目实践代码运行流程出行方案查询JSP 指令与标签库指令页面上下文路径设置表单部分查询结果显示部分 使用感受优点改进建议 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 文心快码Baidu Comat…

《黑神话:悟空》爆火,作为普通人,该怎么抓住这波风口赚到钱?

目录 一、游戏视频 1.1、游戏教程视频 1.2、游戏剧情视频 二、游戏直播 三、游戏视频出海 四、AI黑神话悟空 大家好&#xff0c;我是小奇&#xff0c;一名热衷于分享AI副业项目的普通博主。不管你是AI小白还是老手&#xff0c;我都能帮你轻松上手&#xff0c;用AI技术赚钱…

【C++ Primer Plus习题】4.7

问题: 解答: #include <iostream> #include <string> using namespace std;typedef struct _Pizza {string companyName;float diameter;float wieght; }Pizza;int main() {Pizza p;cout << "请输入披萨的公司名: ";getline(cin, p.companyName);…

uniapp+vue3的ifdef实现多端配置客服消息

在微信小程序预览&#xff0c;实现客服消息&#xff0c;因是个人版&#xff0c;不支持 button | uni-app官网 (dcloud.net.cn) 条件编译处理多端差异 | uni-app官网 (dcloud.net.cn) uni.makePhoneCall(OBJECT) | uni-app官网 (dcloud.net.cn) //my.vue <template> &l…