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

HarmonyOS Next系列之Echarts图表组件(折线图、柱状图、饼图等)实现(八)

系列文章目录

HarmonyOS Next 系列之省市区弹窗选择器实现(一)
HarmonyOS Next 系列之验证码输入组件实现(二)
HarmonyOS Next 系列之底部标签栏TabBar实现(三)
HarmonyOS Next 系列之HTTP请求封装和Token持久化存储(四)
HarmonyOS Next 系列之从手机选择图片或拍照上传功能实现(五)
HarmonyOS Next 系列之可移动悬浮按钮实现(六)
HarmonyOS Next 系列之沉浸式状态实现的多种方式(七)
HarmonyOS Next系列之Echarts图表组件(折线图、柱状图、饼图等)实现(八)
HarmonyOS Next系列之地图组件(Map Kit)使用(九)
HarmonyOS Next系列之半圆环进度条实现(十)
HarmonyOS Next 系列之列表下拉刷新和触底加载更多数据实现(十一)
HarmonyOS Next系列之实现一个左右露出中间大两边小带缩放动画的轮播图(十二)
HarmonyOS Next系列之水波纹动画特效实现(十三)
HarmonyOS Next系列之华为账号一键登录功能实现(十四)


系列文章目录2

【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上)
【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(下)
【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(上)
【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(下)
【鸿蒙】HarmonyOS Next 组件或页面之间的所有通信(传参)方法总结


文章目录

  • 系列文章目录
  • 系列文章目录2
  • 前言
  • 一、实现原理分析
  • 二、代码实现
    • 1.项目内新建本地html文件引入echarts.min.js
    • 2.Echart.ets组件封装
    • 3.页面使用
  • 三、配置项含函数需特殊处理
    • 代码示例:
  • 总结

前言

HarmonyOS Next(基于API11)实现Echarts图表组件(折线图、柱状图、饼图等)。

Echarts作为web端最流行开源的图表库,有着
多种图表类型,丰富的配置、强大的交互功能、可扩展性强等优点,如果能在鸿蒙上使用对于熟悉web开发同学将无缝衔接,大大减少开发和学习成本。



一、实现原理分析

echarts作为JavaScript实现的开源可视化库只能通过网页形式渲染,所以可以 通过web组件内嵌本地网页形式混合开发。web和应用交互则通过WebviewController.runJavaScript(code)形式往网页注入执行代码。

二、代码实现

1.项目内新建本地html文件引入echarts.min.js

resources/rawfile目录下新建echarts.html和添加echarts.min.js


echarts.html:

<!DOCTYPEhtml><html><head><meta charset="utf-8"><meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;"name="viewport"/><script src="./echarts.min.js"></script><style>*{padding:0;margin:0}body,html{height:100%;width:100%}#container{height:100%;width:100%}</style></head><body><div id="container"></div></body><script>constcontainer=document.getElementById('container')letmyChart=echarts.init(container);functionsetOption(option){myChart?.clear();myChart?.setOption(option)}</script></html>

echarts.min.js

可以从官网在线定制下载echart.js定制

说明:此步骤新建了一个html文件引入了echarts.min.js并初始化echarts,定义了一个
setOption方法,后续通过调用该方法传入配置就能渲染出图表

2.Echart.ets组件封装

封装一个全局通用的echart组件,目录结构如上图所示,其中Echarts.ets为组件文件,ViewModel.ets为图表相关配置数据类型定义

Echarts.ets

importwebviewfrom'@ohos.web.webview'@Componentexportdefaultstruct Echarts{//控制器controller:webview.WebviewController=newwebview.WebviewController();//组件宽@Prop eWidth:string|number='100%'//组件高,单位vp@Prop eHeight:string|number=300//渲染完成回调renderCallBack:(e:Echarts)=>void=()=>{}//更新或渲染组件render(option:Record<string,ESObject>|string){this.controller.runJavaScript(`setOption(${typeofoption==='string'?option:JSON.stringify(option)})`)}build(){Column(){Web({src:$rawfile('echarts.html'),controller:this.controller}).width('100%').height('100%').onPageEnd(e=>{this.renderCallBack&&this.renderCallBack(this)})}.width(this.eWidth).height(this.eHeight)}}

说明:

组件定义了长宽属性,默认宽度100%,高度300vp,
renderCallBack回调函数作用把整个echarts组件实例暴露给引用页面。
render方法重新加载渲染组件,入参为图表配置,入参既可以是对象也可以是字符串,无论何种类型最终都将转换为字符串注入web执行。

在引用页面通过renderCallBack暴露出去的实例调用render方法即可自由刷新图表数据

ViewModel.ets:

/** * echart配置数据类型定义 */exportinterfaceEChartsOption{grid?:EchartGrid,title?:EChartsTitle;tooltip?:EChartsTooltip;legend?:EChartsLegend;xAxis:EChartsXAxis;yAxis:EChartsYAxis;series:EChartsSeries[];}exportinterfaceEchartGrid{top?:number|string bottom?:number|string left?:number|string right?:number|string}exportinterfaceEChartsTitle{text?:string;}exportinterfaceEChartsTooltip{}exportinterfaceEChartsLegend{show?:boolean data?:string[];}exportinterfaceEChartsXAxis{type?:string;data:string[];axisLine?:XAxisAxisLine;axisTick?:XAxisAxisTick boundaryGap?:boolean|Array<string>axisLabel?:AxisLabel}exportinterfaceXAxisAxisLine{show?:boolean}exportinterfaceXAxisAxisTick{show?:boolean}exportinterfaceEChartsYAxis{type?:string splitLine?:YAxisSplitLine splitNumber?:number min?:number max?:number scale?:boolean interval?:number}exportinterfaceAxisLabel{show?:boolean formatter?:string|((value:number|string,index:number)=>string)}exportinterfaceYAxisSplitLine{lineStyle?:AxisSplitLineLineStyle}exportinterfaceAxisSplitLineLineStyle{type?:string}exportinterfaceEChartsSeries{name?:string;type?:string;data:number[];}

ViewModel.ets里面定义了一些常见的图表配置数据结构(类型),方便在引入页中引入使用,可以按需继添加扩展

3.页面使用

Index.ets

importEchartsfrom'../components/Echarts/Echarts'import{EChartsOption}from'../components/Echarts/ViewModel'@Entry @Component struct Index{//图表实例myEchart:Echarts|null=null/* * 图表配置 */option:EChartsOption={//标题title:{text:'基础柱状图'},//图例legend:{data:['访问量']},//x轴配置xAxis:{type:'category',data:[]},//y轴配置yAxis:{type:'value'},//数据配置series:[{data:[],type:'bar',//柱状图name:'访问量'}]};aboutToAppear():void{this.getData()}//接口请求获取数据getData(){//模拟接口请求setTimeout(()=>{//设置x轴数据this.option.xAxis.data=['Mon','Tue','Wed','Thu','Fri','Sat','Sun']//设置y轴数据this.option.series[0].data=[120,200,150,80,70,110,130]//调用render重新渲染this.myEchart?.render(this.option)},2000)}// 组件实例chart?:Echarts;build(){Column(){Echarts({eHeight:300,//回调renderCallBack:(e:Echarts)=>{this.myEchart=e//初次渲染组件,接口获取数据是异步此时this.option可能还没有新数据this.myEchart.render(this.option)}})}.width('100%').height('100%')}}

运行效果:


三、配置项含函数需特殊处理

对于配置项包含函数的情况,例如坐标轴标签设置AxisLabel.formatter字段可以是个函数类型,此时就需要特殊处理。这是因为当我们传递option为对象给render函数时候

this.controller.runJavaScript(`setOption(${typeofoption==='string'?option:JSON.stringify(option)})`)

此时调用JSON.stringify把对象转换为字符串,而JSON.stringify入参内函数会直接被去掉。
因此我们需要自己把option处理成字符串传入即可

代码示例:

给折线图y轴刻度值加个万字

Index.ets

importEchartsfrom'../components/Echarts/Echarts'@Entry @Component struct Index{//图表配置@State option:string=``//x轴数据@State xAxisData:string[]=[];//y轴数据@State seriesData:number[]=[];myEchart:Echarts|null=null;aboutToAppear():void{this.getData()}/* * 设置配置并重新渲染 */setOption(){this.option=`{ title: { text: '基础柱折线图' }, grid:{ left:"15%" }, legend:{ data: ['访问量'] }, xAxis: { type: 'category', data:${JSON.stringify(this.xAxisData)}}, yAxis: { axisLabel: { show: true, formatter:(value, index)=> { return value + '万'; } } }, series: [ { data:${JSON.stringify(this.seriesData)}, type: 'line', name:'访问量' } ] }`this.myEchart?.render(this.option)}//接口请求获取数据getData(){//模拟接口请求setTimeout(()=>{this.xAxisData=['Mon','Tue','Wed','Thu','Fri','Sat','Sun']this.seriesData=[120,200,150,80,70,110,130]this.setOption()},2000)}// 组件实例chart?:Echarts;build(){Column(){Echarts({eHeight:300,renderCallBack:(e:Echarts)=>{this.myEchart=ethis.setOption()}})}.width('100%').height('100%')}}

运行效果:


总结

当然作为混合开发产物性能自然比上不上原生,但是echarts有着跨平台兼容性好等优点,对付数据量不大、交互要求不高的场景绰绰有余。目前处于起步发展阶段的鸿蒙来说还没有一款稳定成熟、配置丰富能满足各种ui设计要求的官方或三方组件库。所以只要你的开发场景对性能要求不高,web形式的echart也是个不错的选择,尤其能实现各种定制化ui。

http://www.jsqmd.com/news/1349084/

相关文章:

  • 苏州网站建设搜q479185700,揭秘中小企业做网站的底层逻辑与避坑指南,帮你省钱又省心
  • node+expressvue 自制一键部署服务
  • 用Python做设备OEE看板:实时刷新方案
  • Agent Governance Toolkit与Kafka集成:高吞吐量AI代理事件处理
  • QRemeshify:5分钟掌握Blender智能重拓扑的终极指南
  • 5分钟上手Poly Haven Assets插件:让Blender资产获取变得前所未有的简单
  • CaptfEncoder终极指南:网络安全编码转换神器免费上手
  • 2026年电动车托运到底哪种方式最省钱?避坑指南来了 - 快递物流资讯
  • 揭秘giget的8大核心功能:为什么它能替代传统Git克隆?
  • BiliTools终极指南:3分钟掌握90分钟视频精华的AI智能总结神器
  • 企业ETL团队转型:现代数据集成平台ETLCloud实践指南
  • 2026年pdf转化为word文档免费工具盘点:这七款转换器实测横评,安全无水印怎么选
  • Python 所有算法汇总:从基础到高级的完整指南
  • SlidingCard动画原理揭秘:如何实现平滑过渡与3D旋转效果
  • 探索vue-blog技术架构:前端Vuex与后端Express的完美结合
  • 在线拼图软件有哪些?2026年六款图片拼接长图工具盘点对比 - AI测评专家
  • AI 电动节日烟花灯笼智能功率 覆盖电机驱动、LED 矩阵控制、传感器供电的完整选型方案
  • FAB倒班的真相:身体和收入的账怎么算
  • 开机过程关键日志记录和介绍
  • 如何3分钟批量处理1000个视频字幕:MKVToolNix批量工具完全指南
  • MySQL 基础用法(上):库表管理与数据增删改
  • 深度相机实战指南:从传感器标定到机器人视觉系统集成完全掌握
  • TencentDB Agent Memory插件开发指南:如何扩展自定义记忆处理模块?
  • Postmanerator开发指南:如何创建自定义主题
  • 终极多显示器壁纸管理指南:告别拼接错位,让桌面视觉体验飙升
  • 5个核心功能带你玩转career-ops:开源AI求职自动化工具完全指南
  • 定投10年从1W到100W基金投资复盘05-两周组合定投复盘
  • 深圳搬家公司哪家正规?2026年工商+交通双资质核查结果 - 禧燕搬家
  • Table Transformer实战指南:基于DETR的智能表格提取解决方案
  • 2026年河北优秀的缝制防护罩制造商怎么选才靠谱,认准坤腾机床 - 品牌优推