vue3 tsx 项目中使用 Antv/G2 实现多线折线图

Antv/G2 文档
Antv/G2 双折线图

安装依赖

项目中安装 antv/g2 依赖库:

npm install @antv/g2 --save

安装成功:
在这里插入图片描述

项目使用

新建文件 IndicatorTrend.tsx

import { defineComponent, PropType, onMounted, ref } from 'vue'
import { useChartAutoResize } from '@/hooks/chart'
import styled from '@/styled-components'
import { Chart } from '@antv/g2';export interface TrendListItem {date: stringcity: stringtempvalue: number
}interface Props {dataList?: TrendListItem[]
}const Container = styled.div`  width: 100%;height: 100%;
`const TitleBox = styled.h3`margin-bottom: 10px;
`const ChartContainer = styled.div`height:100%;
`export default defineComponent({props: {dataList: {type: Array as PropType<TrendListItem[]>,default: () => []}},setup() {const dataList = ref<TrendListItem[]>([])const canvasRef = ref<null | HTMLElement>(null)const chartRef = ref<null | InstanceType<typeof Chart>>(null)onMounted(() => {if (canvasRef.value) {const chart = new Chart({container: canvasRef.value,autoFit: true})chartRef.value = chart}refreshChartView()})useChartAutoResize(canvasRef, chartRef)function refreshChartView(){      const chart: any = chartRef.valuechart.clear()setTimeout(() => {chart.data(dataList.value)chart.scale({date: {range: [0, 1],},tempvalue: {nice: true,},});chart.tooltip({showCrosshairs: true,shared: true,});chart.axis('tempvalue', {label: {formatter: (val:number) => {return val + ' °C';},},});chart.line().position('date*tempvalue').color('city').shape('smooth');chart.point().position('date*tempvalue').color('city').shape('circle').style({stroke: '#fff',lineWidth: 1,});chart.render()})}return (props: Props) => {dataList.value = props.dataList || []return (<Container><TitleBox>总趋势</TitleBox> <ChartContainer>      <div ref={canvasRef} />     </ChartContainer>   </Container>)}}
})

其中,引用了公共方法 hooks/chart

import { ref, onUnmounted, watchEffect } from 'vue'
import { changeSizeAfterCanvasResize, deleteGlobalChartItem } from '@/utils/chart'// 没找到ref的类型
export const useChartAutoResize = (canvasRef: any, chartRef: any): void => {const queueIndex = ref<number>(-1)const isCreated = ref(false)function clearThisChart() {queueIndex.value > 0 && deleteGlobalChartItem(queueIndex.value)}// 后续如果需要重复绑定,可以返回一个更新的方法watchEffect(() => {if (!isCreated.value && canvasRef.value && chartRef.value) {clearThisChart()isCreated.value = truequeueIndex.value = changeSizeAfterCanvasResize(canvasRef.value, chartRef.value)}}, {flush: 'post'})onUnmounted(() => {clearThisChart()})
}

utils/chart 文件:

import { Chart } from '@antv/g2'
import { ChartResizeQueueItem } from '@/globalType'const getChartIndex: () => number = createChartIndex()export function getGlobalChartQueue(): ChartResizeQueueItem[] {return window.chartResizeQueue
}export function setGlobalChartQueue(arr: ChartResizeQueueItem[]): ChartResizeQueueItem[] {window.chartResizeQueue = arrreturn window.chartResizeQueue
}export function deleteGlobalChartItem(index: number): void {const queue = getGlobalChartQueue()setGlobalChartQueue(queue.filter(item => item.index !== index))
}// canvas适应父元素的大小,并刷新图表宽高
export function refreshChartSize(canvas: HTMLElement, chart: Chart): void {let width: number = 0let height: number = 0if (canvas.parentNode && getComputedStyle) {const styles = getComputedStyle(canvas.parentNode as HTMLElement)width = Number(styles.width.split('px')[0])height = Number(styles.height.split('px')[0])} else if (canvas.parentNode) {width = (canvas.parentNode as HTMLElement).offsetWidthheight = (canvas.parentNode as HTMLElement).offsetHeight}canvas.setAttribute('width', `${width}px`)canvas.setAttribute('height', `${height}px`)chart.changeSize(width, height)
}// 添加到全局图表队列,并且自动更新宽高
export function changeSizeAfterCanvasResize(canvas: HTMLElement, chart: InstanceType<typeof Chart>): number {const queue = getGlobalChartQueue()const index: number = getChartIndex()refreshChartSize(canvas, chart)setGlobalChartQueue(queue.concat([{ index, canvas, chart }]))return index
}function createChartIndex() {let index: number = 0return (): number => {index++return index}
}

globalType.ts 文件:

export interface ChartResizeQueueItem {index: numbercanvas: HTMLElement,chart: any
}

在父组件中引用 IndicatorTrend.tsx 组件:

<IndicatorTrend dataList={totalTrendList.value}></IndicatorTrend>         

数据源为:

totalTrendList.value = [{date: '2023/8/1',city: 'bily',tempvalue: 4623}, {date: '2023/8/1',city: 'cily',tempvalue: 2208}, {date: '2023/8/1',city: 'bill',tempvalue: 182}, {date: '2023/8/2',city: 'bily',tempvalue: 6145}, {date: '2023/8/2',city: 'cily',tempvalue: 2016}, {date: '2023/8/2',city: 'bill',tempvalue: 257}, {date: '2023/8/3',city: 'bily',tempvalue: 508}, {date: '2023/8/3',city: 'cily',tempvalue: 2916}, {date: '2023/8/3',city: 'bill',tempvalue: 289}, {date: '2023/8/4',city: 'bily',tempvalue: 6268}, {date: '2023/8/4',city: 'cily',tempvalue: 4512}, {date: '2023/8/4',city: 'bill',tempvalue: 428}, {date: '2023/8/5',city: 'bily',tempvalue: 6411}, {date: '2023/8/5',city: 'cily',tempvalue: 8281}, {date: '2023/8/5',city: 'bill',tempvalue: 619}, {date: '2023/8/6',city: 'bily',tempvalue: 1890}, {date: '2023/8/6',city: 'cily',tempvalue: 2008}, {date: '2023/8/6',city: 'bill',tempvalue: 87}, {date: '2023/8/7',city: 'bily',tempvalue: 4251}, {date: '2023/8/7',city: 'cily',tempvalue: 1963}, {date: '2023/8/7',city: 'bill',tempvalue: 706}, {date: '2023/8/8',city: 'bily',tempvalue: 2978}, {date: '2023/8/8',city: 'cily',tempvalue: 2367}, {date: '2023/8/8',city: 'bill',tempvalue: 387}, {date: '2023/8/9',city: 'bily',tempvalue: 3880}, {date: '2023/8/9',city: 'cily',tempvalue: 2956}, {date: '2023/8/9',city: 'bill',tempvalue: 488}, {date: '2023/8/10',city: 'bily',tempvalue: 3606}, {date: '2023/8/10',city: 'cily',tempvalue: 678}, {date: '2023/8/10',city: 'bill',tempvalue: 507}, {date: '2023/8/11',city: 'bily',tempvalue: 4311}, {date: '2023/8/11',city: 'cily',tempvalue: 3188}, {date: '2023/8/11',city: 'bill',tempvalue: 548}, {date: '2023/8/12',city: 'bily',tempvalue: 4116}, {date: '2023/8/12',city: 'cily',tempvalue: 3491}, {date: '2023/8/12',city: 'bill',tempvalue: 456}, {date: '2023/8/13',city: 'bily',tempvalue: 6419}, {date: '2023/8/13',city: 'cily',tempvalue: 2852}, {date: '2023/8/13',city: 'bill',tempvalue: 689}, {date: '2023/8/14',city: 'bily',tempvalue: 1643}, {date: '2023/8/14',city: 'cily',tempvalue: 4788}, {date: '2023/8/14',city: 'bill',tempvalue: 280}, {date: '2023/8/15',city: 'bily',tempvalue: 445}, {date: '2023/8/15',city: 'cily',tempvalue: 4319}, {date: '2023/8/15',city: 'bill',tempvalue: 176}]

页面效果:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全网最全指南:什么是产品手册?又该如何编写呢?

如果你想提高对用户的支持&#xff0c;优先制作产品的产品手册至关重要。事实上&#xff0c;如果用户不知道如何使用你的产品&#xff0c;他们很可能会失去兴趣。用户通常在向客户寻求帮助之前会参考产品手册&#xff0c;因此你的手册是一个宝贵的资源&#xff0c;可以帮助降低…

算法通关村——归并排序

归并排序 1、归并排序原理 ​ 归并排序是一种很经典的分治策略。 ​ 归并排序(MERGE-SORT)简单来说就是将大的序列先视为若干小的数组&#xff0c;分成几个比较小的结构&#xff0c;然后是利用归并的思想实现的排序方法。将一个大的问题分解成一些小的问题分别求解&#xff…

基于ssm流浪动物救助管理系统

基于ssm流浪动物救助管理系统 摘要 随着城市化的不断发展&#xff0c;流浪动物问题逐渐凸显&#xff0c;而对流浪动物的救助和管理成为社会关注的焦点。本文基于SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架&#xff0c;设计并实现了一套流浪动物救助管理系统。该系…

EasyPOI实现excel文件导出

EasyPOI真的是一款非常好用的文件导出工具&#xff0c;相较于传统的一行一列的数据导出&#xff0c;这种以实体类绑定生成的方式真的非常方便&#xff0c;也希望大家能够了解、掌握其使用方法&#xff0c;下面就用一个实例来简单介绍一下EasyPOI的使用。 1.导入依赖 <!-- e…

吴恩达《机器学习》8-5->8-6:特征与直观理解I、样本与值观理解II

8.5、特征与直观理解I 一、神经网络的学习特性 神经网络通过学习可以得出自身的一系列特征。相对于普通的逻辑回归&#xff0c;在使用原始特征 x1​,x2​,...,xn​ 时受到一定的限制。虽然可以使用一些二项式项来组合这些特征&#xff0c;但仍然受到原始特征的限制。在神经网…

win10配置单一python版本的sublime运行环境

①新建test.py输入下面代码 import sys print ("Python Version {}".format(str(sys.version).replace(\n, ))) ②Ctrlshiftp选择python ③按下CtrlB

【论文精读】VOYAGER: An Open-Ended Embodied Agent with Large Language Models

Understanding LSTM Networks 前言Abstract1 Introduction2 Method2.1 Automatic Curriculum2.2 Skill Library2.3 Iterative Prompting Mechanism 3 Experiments3.1 Experimental Setup3.2 Baselines3.3 Evaluation Results3.4 Ablation Studies3.5 Multimodal Feedback from …

Spring基础学习——web

Spring基础学习——web 一、Spring整合Web环境1.1 JavaWeb三大组件作用及其特点1.2 Spring整合Web环境的思路及实现1.3 Spring开发Web环境组件spring-web1.4 web层MVC框架思想与设计思路 一、Spring整合Web环境 1.1 JavaWeb三大组件作用及其特点 在Java语言当中&#xff0c;w…

一题带你写出图论算法模板!!!

这题是道基础的图论算法题目 注释很重要&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 在做这道题之前&#xff0c;我们先了解一下基础的图论算法吧&#xff01;&#xff01;&#xff01; 1.floyd&#xff1a; 这样可以求出所有点…

100G.的DDoS高防够用吗?

很多人以为100G的DDoS防御已经足够了&#xff0c;但殊不知DDoS攻击大小也是需要分行业类型的&#xff0c;比如游戏、金融、影视、电商甚至ZF或者行业龙头等等行业类型&#xff0c;都是大型DDoS攻击的重灾区&#xff0c;别说100G防御&#xff0c;就算300G防御服务器也不一定够用…

LOWORD, HIWORD, LOBYTE, HIBYTE的解释

文章目录 实验结论 实验 int 类型大小正常为4Byte 以小端序来看 0x12345678在内存中的存储为 0x78 0x56 0x34 0x120x78在低地址&#xff0c;0x12在高地址 程序输出 #include <stdio.h> #include <string.h> #include<windows.h>int main() {int a 0x12345…

开源供应链管理系统 多供应商批发管理系统方案及源码输出

开发框架&#xff1a;PHPMySQL 后端框架&#xff1a;ThinkPHP 订货端&#xff1a;PC小程序 客户订货端&#xff1a;小程序 多仓库OR多供应商&#xff1a;多供应商 是否进销存&#xff1a;自带进销存 整个方案含B端订货PC、小程序端、C端小程序端下单&#xff0c;源码&…