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.rhkb.cn/news/194480.html

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

相关文章

全新的FL studio21.2版支持原生中文FL studio2024官方破解版

FL studio2024官方破解版是一款非常专业的音频编辑制作软件。目前它的版本来到了全新的FL studio21.2版&#xff0c;支持原生中文&#xff0c;全面升级的EQ、母带压线器等功能&#xff0c;让你操作起来更加方便&#xff0c;该版本经过破解处理&#xff0c;用户可永久免费使用&a…

【DevOps】Git 图文详解(一):简介及基础概念

Git 图文详解&#xff08;一&#xff09;&#xff1a;简介及基础概念 1.简介&#xff1a;认识 Git2.基础概念&#xff1a;Git 是干什么的&#xff1f;2.1 概念汇总2.2 工作区 / 暂存区 / 仓库2.3 Git 基本流程2.4 Git 状态 1.简介&#xff1a;认识 Git Git 是当前最先进、最主…

五分钟k8s实战-Istio 网关

istio-03.png 在上一期 k8s-服务网格实战-配置 Mesh 中讲解了如何配置集群内的 Mesh 请求&#xff0c;Istio 同样也可以处理集群外部流量&#xff0c;也就是我们常见的网关。 其实和之前讲到的k8s入门到实战-使用Ingress Ingress 作用类似&#xff0c;都是将内部服务暴露出去的…

计算机网络:网络层ARP协议

在实现IP通信时使用了两个地址&#xff1a;IP地址&#xff08;网络层地址&#xff09;和MAC地址&#xff08;数据链路层地址&#xff09; 问题&#xff1a;已知一个机器&#xff08;主机或路由器&#xff09;的IP地址&#xff0c;如何找到相应的MAC地址&#xff1f; 为了解决…

mac下vue-cli从2.9.6升级到最新版本

由于mac之前安装了 vue 2.9.6 的版本&#xff0c;现在想升级到最新版本&#xff0c;用官方给的命令&#xff1a; npm uninstall vue-cli -g 发现不行。 1、究其原因&#xff1a;从vue-cli 3.0版本开始原来的npm install -g vue-cli 安装的都是旧版&#xff0c;最高到2.9.6。安…

TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…

QT自定义信号,信号emit,信号参数注册

qt如何自定义信号 使用signals声明返回值是void在需要发送信号的地方使用 emit 信号名字(参数)进行发送 在需要链接的地方使用connect进行链接 ct进行链接

初识Java 18-1 泛型

目录 简单泛型 元组库 通过泛型实现栈类 泛型接口 泛型方法 可变参数和泛型方法 通用Supplier 简化元组的使用 使用Set创建实用工具 本笔记参考自&#xff1a; 《On Java 中文版》 继承的层次结构有时会带来过多的限制&#xff0c;例如&#xff1a;编写的方法或类往往…

Android——模块级build.gradle配置——applicationId和namespace

官方地址&#xff1a; 配置应用模块-applicationId和namespace了解 build.gradle 中的实用设置。https://developer.android.google.cn/studio/build/configure-app-module?hlzh-cn 产生那些异常场景&#xff1a; Android&#xff1a;Namespace not specified. Please spec…

Windows SmartScreen中的漏洞!

&#x1f525;另一个流行漏洞是 CVE-2023-36025 - 绕过 Windows SmartScreen 安全功能&#xff0c;该功能是多个微软产品的网络钓鱼和恶意软件保护组件。 &#x1f47e;有多危险 利用该漏洞&#xff0c;攻击者可以绕过 Windows Defender SmartScreen 检查和相关警告。利用该漏…

ProtocolBuffers(protobuf)详解

目录 前言特点语法定义关键字JSON与Protocol Buffers互相转换gRPC与Protocol Buffers的关系 前言 Protocol Buffers&#xff08;通常简称为protobuf&#xff09;是Google公司开发的一种数据描述语言&#xff0c;它能够将结构化数据序列化&#xff0c;可用于数据存储、通信协议…

mysql数据模型

创建数据库 命令 create database hellox &#xff1a; &#xff08; hellox名字&#xff09; sql语句 创建 数据库 命令 create database hell&#xff1b; 也是创建但是有数据库不创建 命令 create database if not exists hell ; 切换数据库 命令 use hello&…

传统广电媒体为何选择上云?有何优势?

随着现在互联网和科技的发展&#xff0c;现在更多的行业都搭上了科技这辆快车快速的完成了转型&#xff0c;那么在传统的广电媒资行业他们目前有哪些痛点呢&#xff1f;传统广电媒体转型发展现状是什么&#xff1f;企业如何数字化转型&#xff1f;企业上云的优势有哪些&#xf…

网络安全-学习手册

前言 前几天发布了一篇 网络安全&#xff08;黑客&#xff09;自学 没想到收到了许多人的私信想要学习网安黑客技术&#xff01;却不知道从哪里开始学起&#xff01;怎么学 今天给大家分享一下&#xff0c;很多人上来就说想学习黑客&#xff0c;但是连方向都没搞清楚就开始学习…

【Qt之QWizard问题】setPixmap()设置logo、background、watermark无效不显示解决方案

问题原因&#xff1a; 使用QWizard或者QWizardPage设置像素图&#xff0c;结果设置完不显示效果。 设置示例&#xff1a; setPixmap(QWizard::WatermarkPixmap, QPixmap("xxx/xxx/xxx.png"));setPixmap(QWizard::BackgroundPixmap, QPixmap("xxx/xxx/xxx.png&…

飞书开发学习笔记(六)-网页应用免登

飞书开发学习笔记(六)-网页应用免登 一.上一例的问题修正 在上一例中&#xff0c;飞书登录查看网页的界面显示是有误的&#xff0c;看了代码&#xff0c;理论上登录成功之后&#xff0c;应该显示用户名等信息。 最后的res.nickName是用户名&#xff0c;res.i18nName.en_us是英…

Git目录不对,即当前文件夹不对应git仓库

报错信息是&#xff1a; fatal: not a git repository (or any of the parent directories): .git 如&#xff1a; 是当前文件夹不对应git仓库&#xff0c;一般在git clone之后&#xff0c;需要进入下一级文件夹才对应仓库。 在文件夹看&#xff0c;本层中没有.git文件夹&…

Unity开发之C#基础-集合(字典)(Dictionary)

前言 Hello 兄弟们 一转眼俩月又过去了&#xff08;失踪人口回归&#xff09; 不出意外的是出意外了 失踪了两个月 有点对不起我这为数不多的粉丝们 实不相瞒忙的焦头烂额 也没心情写博客 实在对不住各位 好了长话短说 今天这篇文章是讲解c#当中的新的一种集合的表现&#xff…

这7个“小毛病”项目经理必须克服

大家好&#xff0c;我是老原。 项目经理干项目可能不在行&#xff0c;但“踩坑”、“背锅”一定在行。 当上项目经理不容易&#xff0c;当好项目经理更不容易&#xff0c;有永远填不完的坑和背不完的锅。 如果要问项目经理都踩过哪些坑&#xff0c;那真的是太多了&#xff0…

《C++避坑神器·二十一》回调函数使用

1、不涉及类的回调函数使用&#xff1a; 注意&#xff1a;提供给别人使用的就是注册回调函数的那个接口 void registHeightcallback(CallbackFun callback, void* contex) 2、涉及类的回调函数使用&#xff1a; 一般提供给别人使用的都是注册回调函数的接口 在类中定义的回调函…