当前位置: 首页 > news >正文

Vue3实战笔记(45)—VUE3封装一些echarts常用的组件,附源码

文章目录

  • 前言
  • 一、柱状图框选
  • 二、折线图堆叠
  • 总结


前言

日前使用hooks的方式封装组件,在我使用复杂的图标时候遇到了些问题,预想在onMounted中初始化echarts,在使用hooks的时候,组件没有渲染完,使用实例会出现各种各样的问题,并且在hooks中使用一些外部属性也属实遇到了些麻烦,先用蠢方法直接封装两个插件做dashboard用,后面有时间重新完善封装echarts。


一、柱状图框选

柱状图框选,新建组件EChartsBarBrush.vue:


<template><div ref="chartContainer" style="width: 100%; height: 100%"></div>
</template><script setup lang="ts" name="">
import useECharts from '@/hooks/useECharts';
import { ref, onMounted, onUnmounted } from 'vue';
import * as echarts from 'echarts';const chartContainer = ref(null);let xAxisData: string[] = [];
let data1: number[] = [];
let data2: number[] = [];
let data3: number[] = [];
let data4: number[] = [];for (let i = 0; i < 10; i++) {xAxisData.push('Class' + i);data1.push(+(Math.random() * 2).toFixed(2));data2.push(+(Math.random() * 5).toFixed(2));data3.push(+(Math.random() + 0.3).toFixed(2));data4.push(+Math.random().toFixed(2));
}var emphasisStyle = {itemStyle: {shadowBlur: 10,shadowColor: 'rgba(0,0,0,0.3)'}
};const options = ref({legend: {data: ['bar', 'bar2', 'bar3', 'bar4'],left: '10%'},brush: {toolbox: ['rect', 'polygon', 'lineX', 'lineY', 'keep', 'clear'],xAxisIndex: 0},toolbox: {feature: {magicType: {type: ['stack']},dataView: {}}},tooltip: {},xAxis: {data: xAxisData,name: 'X Axis',axisLine: { onZero: true },splitLine: { show: false },splitArea: { show: false }},yAxis: {},grid: {bottom: 100},series: [{name: 'bar',type: 'bar',stack: 'one',emphasis: emphasisStyle,data: data1},{name: 'bar2',type: 'bar',stack: 'one',emphasis: emphasisStyle,data: data2},{name: 'bar3',type: 'bar',stack: 'two',emphasis: emphasisStyle,data: data3},{name: 'bar4',type: 'bar',stack: 'two',emphasis: emphasisStyle,data: data4}]
});
// const chartInstance = useECharts(chartContainer, options);
onMounted(() => {// 初始化 ECharts 实例const chartInstance = echarts.init(chartContainer.value);// 设置 ECharts 配置项chartInstance.setOption(options.value);chartInstance.on('brushSelected', function (params: any) {var brushed = [];var brushComponent = params.batch[0];for (var sIdx = 0; sIdx < brushComponent.selected.length; sIdx++) {var rawIndices = brushComponent.selected[sIdx].dataIndex;brushed.push('[Series ' + sIdx + '] ' + rawIndices.join(', '));}chartInstance.setOption({title: {backgroundColor: '#333',text: 'SELECTED DATA INDICES: \n' + brushed.join('\n'),bottom: 0,right: '10%',width: 100,textStyle: {fontSize: 12,color: '#fff'}}});
});// 监听窗口大小变化,自动调整图表大小window.addEventListener('resize', () => chartInstance.resize());});</script><style lang='scss' scoped>
</style>

在这里插入图片描述

二、折线图堆叠

折线图堆叠,新建EChartSlineStack.vue


<template><div ref="chartContainer" style="width: 100%; height: 100%"></div>
</template><script setup lang="ts" name="">
import { ref } from 'vue';
import useECharts from '@/hooks/useECharts';const chartContainer = ref(null);
const options = ref({title: {text: 'Stacked Line'},tooltip: {trigger: 'axis'},legend: {data: ['Email', 'Union Ads', 'Video Ads', 'Direct', 'Search Engine']},grid: {left: '3%',right: '4%',bottom: '3%',containLabel: true},toolbox: {feature: {saveAsImage: {}}},xAxis: {type: 'category',boundaryGap: false,data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']},yAxis: {type: 'value'},series: [{name: 'Email',type: 'line',stack: 'Total',data: [120, 132, 101, 134, 90, 230, 210]},{name: 'Union Ads',type: 'line',stack: 'Total',data: [220, 182, 191, 234, 290, 330, 310]},{name: 'Video Ads',type: 'line',stack: 'Total',data: [150, 232, 201, 154, 190, 330, 410]},{name: 'Direct',type: 'line',stack: 'Total',data: [320, 332, 301, 334, 390, 330, 320]},{name: 'Search Engine',type: 'line',stack: 'Total',data: [820, 932, 901, 934, 1290, 1330, 1320]}]
});const chartInstance = useECharts(chartContainer, options);// 你可以在这里根据需要操作 ECharts 实例,例如更新数据
// chartInstance.value.setOption({...})
</script><style lang='scss' scoped>
</style>

在这里插入图片描述


总结

为啥这两天封装了好几个echarts组件呢,上头了一样,通过封装ECharts组件,可以将图表的基本配置、数据处理、事件处理等逻辑封装在一个组件中,从而实现代码的复用。这样,在需要使用相同类型的图表时,只需引入该组件,而无需重复编写相同的代码。明天就体验一下好处。

得意勿恣意奢侈,失意勿抑郁失措。

相关文章:

  • 【DZ模板】克米设计APP手机版本地化+完美使用
  • Atlas 200I DK A2安装MindSpore Ascend版本
  • Yolov9调用COCOAPI生成APs,APm,APl
  • 每日OJ题_剑指offer斐波那契数列篇
  • 奇舞周刊第529期:万字长文入门前端全球化
  • STM32F1之OV7725摄像头
  • Golang | Leetcode Golang题解之第112题路径总和
  • 医院门诊互联电子病历|基于SSM+vue的医院门诊互联电子病历管理信息系统的设计与实现(源码+数据库+文档)
  • 存在重复元素 II[简单]
  • 文件编码格式查看和转换
  • Websocket助手
  • pyhton调用STK常用代码
  • 【vue3】嵌套的 effect 与 effect 栈
  • 【spring】@ControllerAdvice注解学习
  • 【设计模式】桥接模式
  • Angular 响应式表单之下拉框
  • axios 和 cookie 的那些事
  • CSS相对定位
  • Java到底能干嘛?
  • Java应用性能调优
  • Koa2 之文件上传下载
  • nodejs调试方法
  • Spring Cloud Feign的两种使用姿势
  • 从0实现一个tiny react(三)生命周期
  • 前端临床手札——文件上传
  • 三分钟教你同步 Visual Studio Code 设置
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 做一名精致的JavaScripter 01:JavaScript简介
  • # .NET Framework中使用命名管道进行进程间通信
  • #window11设置系统变量#
  • (13):Silverlight 2 数据与通信之WebRequest
  • (2015)JS ES6 必知的十个 特性
  • (27)4.8 习题课
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)计算机毕业设计高校学生选课系统
  • (原)本想说脏话,奈何已放下
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET CLR基本术语
  • .Net IOC框架入门之一 Unity
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .NET企业级应用架构设计系列之开场白
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .NET应用架构设计:原则、模式与实践 目录预览
  • :中兴通讯为何成功
  • @Builder用法
  • @EnableConfigurationProperties注解使用
  • @ModelAttribute使用详解
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [ACM] hdu 1201 18岁生日
  • [EFI]DELL XPS13 9360电脑 Hackintosh 黑苹果efi引导文件