HarmonyOS Next系列之Echarts图表组件(折线图、柱状图、饼图等)实现(八)
创始人
2024-11-10 05:09:21
0

系列文章目录

HarmonyOS Next 系列之省市区弹窗选择器实现(一)
HarmonyOS Next 系列之验证码输入组件实现(二)
HarmonyOS Next 系列之底部标签栏TabBar实现(三)
HarmonyOS Next 系列之HTTP请求封装和Token持久化存储(四)
HarmonyOS Next 系列之从手机选择图片或拍照上传功能实现(五)
HarmonyOS Next 系列之可移动悬浮按钮实现(六)
HarmonyOS Next 系列之沉浸式状态实现的多种方式(七)
HarmonyOS Next系列之Echarts图表组件(折线图、柱状图、饼图等)实现(八)


文章目录

  • 系列文章目录
  • 前言
  • 一、实现原理分析
  • 二、代码实现
    • 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:

                         

echarts.min.js

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

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

2.Echart.ets组件封装

在这里插入图片描述

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

Echarts.ets

import webview from '@ohos.web.webview'  @Component export default struct Echarts {   //控制器   controller: webview.WebviewController = new webview.WebviewController();   //组件宽   @Prop eWidth: string | number = '100%'   //组件高,单位vp   @Prop eHeight: string | number = 300   //渲染完成回调   renderCallBack: (e: Echarts) => void = () => {   }    //更新或渲染组件   render(option: Record | string) {     this.controller.runJavaScript(`setOption(${typeof option === '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配置数据类型定义  */ export interface EChartsOption {   grid?: EchartGrid,   title?: EChartsTitle;   tooltip?: EChartsTooltip;   legend?: EChartsLegend;   xAxis: EChartsXAxis;   yAxis: EChartsYAxis;   series: EChartsSeries[]; }  export  interface EchartGrid {   top?: number|string   bottom?: number|string   left?: number|string   right?: number|string }  export interface EChartsTitle {   text?: string; }  export interface EChartsTooltip {}  export interface EChartsLegend {   show?:boolean   data?: string[]; }   export interface EChartsXAxis {   type?: string;   data: string[];   axisLine?: XAxisAxisLine;   axisTick?: XAxisAxisTick   boundaryGap?: boolean | Array   axisLabel?: AxisLabel  }  export interface XAxisAxisLine {   show?: boolean }  export interface XAxisAxisTick {   show?: boolean }   export interface EChartsYAxis {   type?: string   splitLine?: YAxisSplitLine   splitNumber?: number   min?: number   max?: number   scale?: boolean   interval?: number  }  export interface AxisLabel {   show?: boolean   formatter?: string | ((value: number | string, index: number) => string) }  export interface YAxisSplitLine {   lineStyle?: AxisSplitLineLineStyle }  export interface AxisSplitLineLineStyle {   type?: string }  export interface EChartsSeries {   name?: string;   type?: string;   data: number[];  } 

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

3.页面使用

Index.ets

import Echarts from '../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(${typeof option === 'string' ? option : JSON.stringify(option)})`) 

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

代码示例:

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

Index.ets

import Echarts from '../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 = e             this.setOption()           }         })      }     .width('100%')     .height('100%')   } } 

运行效果:
在这里插入图片描述


总结

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

相关内容

热门资讯

ia攻略/牛牛房卡代理九酷大厅... 今 日消息,九酷大厅/随意玩房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更...
我来教你/金花房卡专卖店新超圣... 新超圣房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根据...
正规平台有哪些,牛牛房卡怎么获... 微信游戏中心:青鸟大厅房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程...
一分钟实测分享”热玩吧房卡怎么... 一分钟实测分享”热玩吧房卡怎么弄“牛牛房卡哪里有卖游戏中心打开微信,添加客服【113857776】,...
一分钟了解“如何购买金花房卡普... 悠悠大厅是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房卡...
IA解析/斗牛房卡充值天道联盟... IA解析/斗牛房卡充值天道联盟/随意玩/房卡怎么买Sa9Ix苹果iPhone 17手机即将进入量产阶...
我来教你/牛牛充值房卡新竹大厅... 今 日消息,新竹大厅房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单...
玩家攻略”王者大厅房卡“牛牛房... 玩家攻略”王者大厅房卡“牛牛房卡哪里有卖 微信牛牛房卡客服微信号微信游戏中心打开微信,添加客服【11...
推荐一款!牛牛房卡代理天蝎大厅... 微信游戏中心:天蝎大厅房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程...
重大通报,金花充值房卡星驰娱乐... 星驰娱乐是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:【3329006910】或QQ:332900...
科技实测!金花房卡出售新二号/... 您好!微信新二号大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(新二号)大厅介绍:咨询...
终于找到“微信斗牛房卡如何购买... 微信斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:86909166许多玩家在游戏中会购买房卡来...
重大通报,金花房卡是正规的新道... 今 日消息,新道游/新皇豪房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新...
一秒了解”百万牛房卡获取“哪里... 房卡获取是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:113857776许多玩家在游戏中会购买房卡...
我来教你/斗牛房间怎么创建的南... 南瓜大厅/新道游房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 ...
重大通报,牛牛房卡制作链接新众... 微信游戏中心:新众亿/皇豪互娱房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或...
ia实测“微信链接斗牛房卡多少... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡来享受...
正版授权!金花房卡专卖店鲨鱼众... 您好!微信鲨鱼众娱大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(鲨鱼众娱)大厅介绍:...
实测分享”辣椒互娱房卡详细充值... 实测分享”辣椒互娱房卡详细充值“牛牛房卡批发平台游戏中心打开微信,添加客服【113857776】,进...
IA解析/牛牛房卡怎么获得天酷... 天酷大厅房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根...