vue3+ts 封装echarts,根据tabs切换展示

 <div class="bottom"><div class="topli"><p>用电统计</p><div class="tabs"><div class="tab" :class="{ active: active.tab1 === index }"v-for="(item, index) in tabsList1" :key="index" @click="changeTab(1, index)">{{ item.label }}</div></div></div><div class="list"><div id="sum-electricity" v-if="!loading.tab1 && active.tab1 === 0"><TestEleChart pid="sum-electricity" title="月用电统计" :eleData="eleData":eleXdata="eleXdata"></TestEleChart></div><div id="day-electricity" v-if="!loading.tab1 && active.tab1 === 1"><TestEleChart pid="day-electricity" title="日用电统计" :eleData="eleData":eleXdata="eleXdata"></TestEleChart></div></div></div><div class="sitestutus"><div class="top"><p>用水统计</p><div class="tabs"><div class="tab" :class="{ active: active.tab2 === index }"v-for="(item, index) in tabsList" :key="index" @click="changeTab(2, index)">{{ item.label }}</div></div></div><div class="sitebutom"><div id="monthWate" v-if="!loading.tab2 && active.tab2 === 0"><TestWaterChart pid="monthWate" title="月用水" :waterData="waterData":waterXdata="waterXdata"></TestWaterChart></div><div id="dayWater" v-if="!loading.tab2 && active.tab2 === 1"><TestWaterChart pid="dayWater" title="日用水" :waterData="waterData":waterXdata="waterXdata"></TestWaterChart></div></div></div><script setup lang="ts">// tabs切换const tabsList = [{ label: '日' },{ label: '月' },
];const tabsList1 = [{ label: '日' },{ label: '月' },
];const active = ref({tab1: 0,tab2: 0,
});
const loading = ref({tab1: false,tab2: false,
});const waterData = ref<number[]>([]);
const waterXdata = ref<string[]>([]);
const eleData = ref<number[]>([]);
const eleXdata = ref<string[]>([]);// const loading = ref(false)
const fetchData = async (type: string, tabGroup: number) => {if (tabGroup === 1) {loading.value.tab1 = true;const store = siteStore();const res = await reqGetEleStatistics(store.curSite.id, type);eleXdata.value = res.data[type === 'day' ? 'elcWrDay' : 'elcWrMonth'].map((item: any) => item.createTime);eleData.value = res.data[type === 'day' ? 'elcWrDay' : 'elcWrMonth'].map((item: any) => item.value);if (eleData.value.length === 0) {eleXdata.value = ["无数据"];eleData.value = [0];}loading.value.tab1 = false;} else if (tabGroup === 2) {loading.value.tab2 = true;const store = siteStore();const res = await reqGetWaterStatistics(store.curSite.id, type);waterXdata.value = res.data[type === 'day' ? 'elcWrDay' : 'elcWrMonth'].map((item: any) => item.createTime);waterData.value = res.data[type === 'day' ? 'elcWrDay' : 'elcWrMonth'].map((item: any) => item.value);if (waterData.value.length === 0) {waterXdata.value = ["无数据"];waterData.value = [0];}loading.value.tab2 = false;}
};const changeTab = async (tabGroup: number, index: number) => {if (tabGroup === 1) {active.value.tab1 = index;const type = index === 0 ? 'day' : 'month';await fetchData(type, tabGroup);} else if (tabGroup === 2) {active.value.tab2 = index;const type = index === 0 ? 'day' : 'month';await fetchData(type, tabGroup);}
};// 初始化时获取数据
onMounted(async () => {await changeTab(1, active.value.tab1);await changeTab(2, active.value.tab2);
});// scss.bottom {position: absolute;top: vh(635);width: vw(390);height: 400px;.topli {display: flex;}p {width: vw(435);margin-left: vw(10);line-height: vh(40);color: #fff !important;text-indent: 1rem;font-weight: 700;font-size: 25px;}#sum-electricity,#day-electricity {width: vw(385);height: vh(300);}}.sitestutus {position: absolute;top: vh(300);width: vw(385);height: 350px;p {width: vw(435);margin-left: vw(10);line-height: vh(40);color: #fff !important;// background: linear-gradient(84deg, #1d4591 0%, rgba(57, 123, 243, 0) 100%) !important;text-indent: 1rem;font-weight: 700;font-size: 25px;}.sitebutom {color: #fff;font-size: 20px;}#dayWater,#monthWate {width: vw(385);height: vh(300);}}</script>

封装的 柱状图  组件 TestEleChart 

成品如图所示

<!-- 水电大屏用电趋势 -->
<template><div></div>
</template><script setup lang="ts">
import { nextTick, watch, computed, onMounted, ref, onUpdated, onBeforeUnmount } from 'vue';
import echarts from '@/assets/ts/echarts';
import { ZRColor } from 'echarts/types/dist/shared';
import useResizeChart from '@/components/CommonChart/hooks/useResizeChart';
import { color } from 'echarts';
import { EffectScatterChart } from 'echarts/charts';
echarts.use([EffectScatterChart]);const props = defineProps({pid: {type: String,required: true,},title: {type: String,required: true,},// 饼图 颜色color: {type: Array as () => ZRColor[],default: [],},eleData: {type: Array,required: true,},// 横坐标值eleXdata: {type: Array,required: true,}
})const sideData = props.eleData.map((item: any) => item + 7.5)// nextTick(() => {
//     // 2. 容器
//     const container = document.querySelector('#' + props.pid) as HTMLElement;
//     if (container) renderChart(container);
// });
// // 3. 初始化 echarts 实例, 将配置添加给 echarts 实例
let myChart: echarts.ECharts | null = null;
// const renderChart = (container?: HTMLElement) => {
//     if (!myChart) {
//         myChart = echarts.init(container as HTMLElement);
//         // 自适应 chart
//         useResizeChart(container as HTMLElement, myChart as echarts.ECharts);
//     }//     myChart.setOption(option);
// };
// 改进
const initChart = async () => {await nextTick();  // 确保 DOM 更新完成const container = document.querySelector('#' + props.pid) as HTMLElement;if (container) {myChart = echarts.init(container);// 自适应 chart// @ts-ignoreuseResizeChart(container as HTMLElement, myChart);renderChart();}
}// 4.配置项
const renderChart = () => {if(!myChart) return;const option = {backgroundColor: 'transparent',tooltip: {trigger: 'axis',formatter: "{b} : {c}",axisPointer: { // 坐标轴指示器,坐标轴触发有效type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'}},xAxis: {data: props.eleXdata,//坐标轴axisLine: {lineStyle: {color: '#3eb2e8'}},//坐标值标注axisLabel: {show: true,textStyle: {color: '#fff',}}},yAxis: {//坐标轴axisLine: {show: false},//坐标值标注axisLabel: {show: true,textStyle: {color: '#fff',}},//分格线splitLine: {lineStyle: {color: '#4784e8'}}},series: [{name: 'a',tooltip: {show: false},type: 'bar',// 柱子的宽度barWidth: 15,itemStyle: {normal: {color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [{offset: 0,color: "#0B4EC3" // 0% 处的颜色}, {offset: 0.6,color: "#138CEB" // 60% 处的颜色}, {offset: 1,color: "#17AAFE" // 100% 处的颜色}], false)}},data: props.eleData,barGap: 0}, {type: 'bar',barWidth: 8,itemStyle: {normal: {color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [{offset: 0,color: "#09337C" // 0% 处的颜色}, {offset: 0.6,color: "#0761C0" // 60% 处的颜色}, {offset: 1,color: "#0575DE" // 100% 处的颜色}], false)}},barGap: 0,data: sideData}, {name: 'b',tooltip: {show: false},type: 'pictorialBar',itemStyle: {borderWidth: 0,borderColor: '#0571D5',color: '#1779E0'},symbol: 'path://M 0,-10 l 110,0 l -12,85 l -110,0 z',// key[0]为盖子宽度 key[1]为倾斜程度 值小倾斜小symbolSize: ['23', '8'],// key[1] y轴symbolOffset: ['0', '-8'],//symbolRotate: -5,symbolPosition: 'end',data: props.eleData,z: 3}]};myChart.setOption(option);
}
onMounted(initChart);onBeforeUnmount(() => {if (myChart) {myChart.dispose();myChart = null;}
});watch([() => props.eleData, () => props.eleXdata],() => {renderChart();},{ deep: true }
);
</script><style scoped></style>

封装的 柱状图  组件 TestEleChart 

成品如图所示

<!-- 水务大屏柱状图 -->
<template><div :id="props.pid" style="width: 100%; height: 100%;"></div></template><script setup lang="ts">import { nextTick, watch, ref, onMounted, onBeforeUnmount } from 'vue';import * as echarts from 'echarts';import { ZRColor } from 'echarts/types/dist/shared';import useResizeChart from '@/components/CommonChart/hooks/useResizeChart';const props = defineProps({pid: {type: String,required: true,},title: {type: String,required: true,},color: {type: Array as () => ZRColor[],default: () => [],},waterData: {type: Array,required: true,},waterXdata: {type: Array,required: true,}});let myChart: echarts.ECharts | null = null;const initChart = async () => {await nextTick();  // 确保 DOM 更新完成const container = document.querySelector('#' + props.pid) as HTMLElement;if (container) {myChart = echarts.init(container);// 自适应 chart// @ts-ignoreuseResizeChart(container as HTMLElement, myChart);renderChart();}};const renderChart = () => {if (!myChart) return;const option = {backgroundColor: "transparent",color: ["#3cefff"],tooltip: {},grid: {containLabel: true,},xAxis: [{type: "category",data: props.waterXdata,axisTick: {alignWithLabel: true,},nameTextStyle: {color: "#82b0ec",},axisLine: {lineStyle: {color: "#82b0ec",},},axisLabel: {textStyle: {color: "#82b0ec",},},},],yAxis: [{type: "value",axisLabel: {textStyle: {color: "#82b0ec",},formatter: "{value}%",},splitLine: {lineStyle: {color: "#0c2c5a",},},axisLine: {show: false,},},],series: [{name: "",type: "pictorialBar",symbolSize: [20, 10],symbolOffset: [0, -5],symbolPosition: "end",z: 12,label: {show: true,position: "top",formatter: "{c}%",},data: props.waterData,},{name: "",type: "pictorialBar",symbolSize: [20, 10],symbolOffset: [0, 5],z: 12,data: props.waterData,},{type: "bar",itemStyle: {opacity: 0.7,},barWidth: "20",data: props.waterData,markLine: {silent: true,symbol: "none",label: {position: "middle",formatter: "{b}",},data: [{name: "目标值",yAxis: 80,lineStyle: {color: "#ffc832",},label: {position: "end",formatter: "{b}\n {c}%",},},],},},{type: "effectScatter",silent: true,tooltip: {show: false,},zlevel: 3,symbolSize: 10,showEffectOn: "render",rippleEffect: {brushType: "stroke",color: "#3cefff",scale: 5,},itemStyle: {color: "#3cefff",},hoverAnimation: true,data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0],},],};myChart.setOption(option);};onMounted(initChart);onBeforeUnmount(() => {if (myChart) {myChart.dispose();myChart = null;}});watch([() => props.waterData, () => props.waterXdata],() => {renderChart();},{ deep: true });</script><style scoped>/* 样式代码 */</style>

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

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

相关文章

Pikachu SQL注入训练实例

1 数字类型注入 打开Burp Suit工具&#xff0c;选择Proxy&#xff0c;之后点击Open Browser打开浏览器&#xff0c;在浏览器中输入http://localhost:8080/pikachu-master打开Pikachu漏洞练习平台。 选择“数字型注入”&#xff0c;之后点击下拉框随便选择一个ID&#xff0c;…

Apple Vision Pro 和其商业未来

机器人、人工智能相关领域 news/events &#xff08;专栏目录&#xff09; 本文目录 一、Vision Pro 生态系统二、Apple Vision Pro 的营销用例 随着苹果公司备受期待的进军可穿戴计算领域&#xff0c;新款 Apple Vision Pro 承载着巨大的期望。 苹果公司推出的 Vision Pro 售…

测试——进阶篇

内容大纲: 软件测试的各种技术 1. 按照测试对象划分 1.1 界面测试 内容: 验证界面内容显示的完整性&#xff0c;一致性&#xff0c;准确性&#xff0c;友好性。比如界面内容对屏幕大小的自适应&#xff0c;换行&#xff0c;内容是否全部清晰展示&#xff1b;验证整个界面布局…

SAP ABAP性能优化分析工具

SAP系统提供了许多性能调优的工具&#xff0c;重点介绍下最常用几种SM50, ST05, SAT等工具&#xff1a; 1.工具概况 1.1 SM50 / SM66 - 工作进程监视器 通过这两个T-code, 可以查看当前SAP AS实例上面的工作进程&#xff0c;当某一工作进程长时间处于running的状态时&#…

AI 大事件:超级明星 Andrej Karpathy 创立AI教育公司 Eureka Labs

&#x1f9e0; AI 大事件&#xff1a;超级明星 Andrej Karpathy 创立AI教育公司 Eureka Labs 摘要 Andrej Karpathy 作为前 OpenAI 联合创始人、Tesla AI 团队负责人&#xff0c;他的专业性和实力备受瞩目。Karpathy 对 AI 的普及和教育充满热情&#xff0c;从 YouTube 教程到…

【C++报错已解决】 “Use of Uninitialized Variable“

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 在编程过程中&#xff0c;遇到 “Use of Uninitialized Variable” 报错可能会让人感到困惑。这个错误提示通常意味着你尝…

【BUG】已解决:ValueError: Expected 2D array, got 1D array instead

已解决&#xff1a;ValueError: Expected 2D array, got 1D array instead 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉…

Vue脚手架安装(保姆级)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

常用的点云预处理算法

点云预处理是处理点云数据时的重要部分&#xff0c;其目的是提高点云数据的质量和处理效率。通过去除离群点、减少点云密度和增强特征&#xff0c;可以消除噪声、减少计算量、提高算法的准确性和鲁棒性&#xff0c;从而为后续的点云处理和分析步骤&#xff08;如配准、分割和重…

防火墙--带宽管理

目录 核心思想 带宽限制 带宽保证 连接数的限制 如何实现 接口带宽 队列调度 配置位置 在接口处配置 带宽策略配置位置 带宽通道 配置地方 接口带宽、带宽策略和带宽通道联系 配置顺序 带块通道在那里配置 选项解释 引用方式 策略独占 策略共享 重标记DSCP优先…

keysight P9370A/P9375A USB矢量网络分析仪

Keysight P9370A USB 矢量网络分析仪&#xff0c;4.5 GHz P937xA 系列是是德科技紧凑型矢量网络分析仪&#xff08;VNA&#xff09;&#xff0c;其价格适中&#xff0c;并采用完整的双端口设计&#xff0c;可以显著减小测试需要的空间。这款紧凑型VNA 覆盖十分宽广的频 率范围…

移动终端的安全卫士

随着移动互联网的快速发展&#xff0c;移动端安全风险频发。设备指纹技术凭借高精度的设备识别能力&#xff0c;能够帮助企业提升移动端安全防护能力&#xff0c;精准区分合法与风险行为&#xff0c;跨行业赋能风控&#xff0c;为金融、电商、游戏等多领域提供强大的业务安全保…

基于python的图像去水印

1 代码 import cv2 import numpy as npdef remove_watermark(image_path, output_path):# 读取图片image cv2.imread(image_path)# 转换为灰度图gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用中值滤波去除噪声median_filtered cv2.medianBlur(gray, 5)# 计算图像的梯…

数据结构——栈和队列(C语言实现)

写在前面&#xff1a; 栈和队列是两种重要的线性结构。其也属于线性表&#xff0c;只是操作受限&#xff0c;本节主要讨论的是栈和队列的定义、表示方法以及C语言实现。 一、栈和队列的定义与特点 栈&#xff1a;是限定仅在表尾进行插入和删除的线性表。对栈来说&#xff0c;表…

ABAP小白开发操作手册+(六)创建维护视图及事件

目录 开发类型&#xff1a; 开发申请&#xff1a; 开发步骤&#xff1a; 1、创建后台表 2、生成维护视图 3、隐藏自带字段 4、事件代码编写 5、配置事务代码 6、其它个性化需求 6.1、修改维护视图字段的可见长度 6.2、根据后台表查看对应维护视图的事务代码 代码如下…

Modbus通讯接口选择分析

Modbus通讯接口选择分析 Modbus通讯接口的选择涉及到多个方面的考量&#xff0c;包括但不限于通讯距离、数据传输速率、成本、设备兼容性以及应用场景等。下面将从这些角度出发&#xff0c;对Modbus通讯接口的选择进行详细的分析。 Ip67防水面板法兰插座 通讯距离 Modbus通讯…

卸载docker简单且ok的方法

杀死所有容器 docker kill $(docker ps -a -q) 删除所有容器 docker rm $(docker ps -a -q) 删除所有镜像 docker rmi $(docker images -q) 停止docker服务 systemctl stop docker 查看安装列表 yum list installed|grep docker 依次卸载已安装的docker yum -y remove docke…

【iOS】——ARC源码探究

一、ARC介绍 ARC的全称Auto Reference Counting. 也就是自动引用计数。使用MRC时开发者不得不花大量的时间在内存管理上&#xff0c;并且容易出现内存泄漏或者release一个已被释放的对象&#xff0c;导致crash。后来&#xff0c;Apple引入了ARC。使用ARC&#xff0c;开发者不再…

《昇思25天学习打卡营第25天|第10天》

今天是打卡的第十天&#xff0c;今天开始学应用实践中的LLM原理和实践&#xff0c;今天学的是基于MindSpore实现BERT对话情绪识别。最先了解的是BERT模型的简介&#xff08;来自变换器的双向编码器表征量&#xff08;Bidirectional Encoder Representations from Transformers&…

代码随想录算法训练营第22天 | 题目:回溯算法part01 理论基础、77. 组合 、 216.组合总和III 、 17.电话号码的字母组合

代码随想录算法训练营第22天 | 题目&#xff1a;回溯算法part01 理论基础、77. 组合 、 216.组合总和III 、 17.电话号码的字母组合 文章来源&#xff1a;代码随想录 理论基础&#xff1a;代码随想录&#xff1a;回溯算法 模板&#xff1a; void backtracking(参数) {if (终止…