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

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

安装 antV-G2

通过 npm 安装

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

npm install @antv/g2 --save

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

浏览器引入

可以将脚本下载到本地,也可以直接引入在线资源。

引入在线资源

<!-- 引入在线资源,选择需要的 g2 版本以替换 version 变量 -->
<script src="https://gw.alipayobjects.com/os/lib/antv/g2/{{version}}/dist/g2.min.js"></script>
<!-- 浏览器引入,请使用全局命名空间 G2,如 new Chart() 改为 new G2.Chart,即可运行。 -->

引入本地脚本

<!-- 引入本地脚本 -->
<script src="./g2.js"></script>

使用 script 标签引入 G2 资源时,挂载在 window 上的变量名为 G2。所以,实例中需要加上 G2 的前缀。如下:

const chart = new G2.Chart({
})

项目使用

新建文件 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.mzph.cn/news/150898.shtml

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

相关文章

java springboot在测试类中启动一个web环境

我们在开发过程中 可以对数据层 业务层做测试 那我们的表现层能做测试吗&#xff1f; 答案自然是可以的 但是 前提 我们要有一个web环境 我们现在 测试类运行 明显是个很普通的java程序 还是这个 SpringBootTest 它有一个 webEnvironment 我们可以先这样写 package com.examp…

城市生命线丨市政综合管廊监测系统的效果

市政综合管廊&#xff0c;又被称为城市生命线&#xff0c;是我们在地下建造的一个智慧而高效的空间。它把市政、电力、通讯、燃气、给排水等各种管线集于一体&#xff0c;解决了城市中反复开挖路面、架空线网密集、管线事故频发等问题&#xff0c;为城市运行提供了重要的基础设…

Windows安装Vmware 虚拟机

目录 一、Vmware 虚拟机介绍 二、Vmware 虚拟机的三种网络模式 2.1桥接模式 2.2仅主机模式 2.3NAT 网络地址转换模式 三、Vmware 虚拟机的安装 一、Vmware 虚拟机介绍 VMware Workstation Pro 是一款可以在个人电脑的操作系统上创建一个完全与主机操作系统隔离的 虚拟机&…

【技巧】Word和Excel如何互相转换?

Word文档里有数据表格&#xff0c;如果编辑修改起来感觉没那么方便或容易出错&#xff0c;不妨将文档转换成Excel表格再来处理。 将Word文档转换成Excel&#xff0c;比较常用的是复制粘贴方法&#xff0c;也就是将Word文档的表格复制后&#xff0c;再粘贴到Excel表格里&#x…

FPC焊点剥离失效分析

一、案例背景 FPC在后续组装过程中&#xff0c;连接器发生脱落。在对同批次的样品进行推力测试后&#xff0c;发现连接器推力有偏小的现象。据此进行失效分析&#xff0c;明确FPC连接器脱落原因。 #1、#2样品连接器脱落连接器脱落&#xff1b;#3样品连接器未脱落&#xff1b;…

HTTP HTTPS 独特的魅力

目录 HTTP协议 HTTP协议的工作过程 首行 请求头&#xff08;header&#xff09; HOST Content-Length​编辑 User-Agent&#xff08;简称UA&#xff09; Referer Cookie 空行 正文&#xff08;body&#xff09; HTTP响应详解 状态码 报文格式 HTTP响应格式 如何…

鸿蒙:Harmony开发基础知识详解

一.概述 工欲善其事&#xff0c;必先利其器。 上一篇博文实现了一个"Hello Harmony"的Demo&#xff0c;今天这篇博文就以"Hello Harmony" 为例&#xff0c;以官网开发文档为依据&#xff0c;从鸿蒙开发主要的几个方面入手&#xff0c;详细了解一下鸿蒙开…

RAID技术复习笔记

Raid&#xff08;Redundant Array of independent Disks&#xff09;独立磁盘冗余阵列&#xff1a;磁盘阵列 Raid 分为:软raid、硬raid、软硬混合三种。 软Raid&#xff1a;所有的功能均有操作系统和CPU来完成&#xff0c;没有独立的raid控制、处理芯片和IO处理处理芯片。 硬R…

车载通信架构 —— 传统车内通信网络发展回顾

车载通信架构 —— 传统车内通信网络发展回顾 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何…

c语言-数据结构-堆

目录 一、二叉树 1、二叉树的概念 2、完全二叉树和满二叉树 3、完全二叉树的顺序存储 二、堆 2、堆的概念与结构 3、堆的创建及初始化 4、堆的插入&#xff08;小堆&#xff09; 5、堆的删除 6、显示堆顶元素 7、显示堆里的元素个数 8、测试堆的各个功能 9、 实现堆…

学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对博主首页也很感兴趣o (ˉ▽ˉ&#xff1b;) 博主首页&#xff0c;更多redis、java等优质好文以及各种保姆级教程等您挖掘&#xff01; 目录 前言 JetBrains全家桶介绍 申请过程&#xff1a; 获取学…

这个技术也能管理教学质量,厉害了!

在当今数字化时代&#xff0c;教育领域也在积极应用先进的技术来提升教学质量和管理效率。在线巡课系统作为其中的一种创新工具&#xff0c;为学校管理者和教育工作者提供了便捷而高效的管理手段。 在线巡课系统通过数字化、自动化的方式&#xff0c;实现了对课堂教学的全面监控…

Python基础:正则表达式(regular expression)详解

在Python中&#xff0c;正则表达式是一种强大的工具&#xff0c;可用于匹配和操作字符串。什么是正则表达式&#xff1f; 正则表达式是一种模式匹配语言&#xff0c;用于匹配字符串中的特定模式。这些模式可以是字母、数字、字符组合或其他符号。正则表达式通常用于文本处理、网…

excel怎么能锁住行 和/或 列的自增长,保证粘贴公式的时候不自增长或者只有部分自增长

例如在C4单元格中输入了公式&#xff1a; 现在如果把C4拷贝到C5&#xff0c;D3会自增长为D4&#xff1a; 现在如果想拷贝的时候不自增长&#xff0c;可以先把光标放到C4单元格&#xff0c;然后按F4键&#xff0c;行和列的前面加上了$符号&#xff0c;锁定了&#xff1a; …

Linux中的进程终止(详解)

Linux中的进程终止 1. 进程退出场景2. 进程常见退出方法2.1 _exit函数2.2 exit函数2.3 return退出 1. 进程退出场景 代码运行完毕&#xff0c;结果正确代码运行完毕&#xff0c;结果不正确代码异常终止 2. 进程常见退出方法 正常终止&#xff08;可以通过 echo $? 查看进程…

【小黑嵌入式系统第九课】PSoC 5LP第一个实验——LED、字符型LCD显示实验

上一课&#xff1a; 【小黑嵌入式系统第八课】初识PSoC Creator™开发——关于PSoC Creator&下载、创建项目、单片机中的hello world&#xff08;点亮一个led) 文章目录 1 实验目的2 实验要求3 实验设备4 实验原理1. 基于 PWM 原理的 LED 亮度控制2. 时间的计量3. 按键抖动…

超全整理,Pytest自动化测试框架-多进程(pytest-xdist)运行总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 平常我们功能测试…

SpringBoot-AOP学习案例

4. AOP案例 SpringAOP的相关知识我们就已经全部学习完毕了。最后我们要通过一个案例来对AOP进行一个综合的应用。 4.1 需求 需求&#xff1a;将案例中增、删、改相关接口的操作日志记录到数据库表中 就是当访问部门管理和员工管理当中的增、删、改相关功能接口时&#xff0…

整形数据和浮点型数据在内存中的存储差别

愿所有美好如期而遇 我们先来看代码&#xff0c;猜猜结果是什么呢&#xff1f; int main() {//以整型数据的方式存储int n 10;float* m (float*)&n;//以整型数据的方式读取printf("%d\n", n);//以浮点型数据的方式2读取printf("%f\n", *m);printf(&…

Linux下查看pytorch运行时真正调用的cuda版本

一般情况我们会安装使用多个cuda版本。而且pytorch在安装时也会自动安装一个对应的版本。 正确查看方式&#xff1a; 想要查看 Pytorch 实际使用的运行时的 cuda 目录&#xff0c;可以直接输出 cpp_extension.py 中的 CUDA_HOME 变量。 import torch import torch.utils imp…