【微信小程序-原生开发】实用教程22 - 绘制图表(引入 echarts,含图表的懒加载-获取到数据后再渲染图表,多图表加载等技巧)

简介: 【微信小程序-原生开发】实用教程22 - 绘制图表(引入 echarts,含图表的懒加载-获取到数据后再渲染图表,多图表加载等技巧)

最终效果预览

实现流程

微信小程序中使用 echarts 需使用官方提供的 ec-canvas 组件

1. 下载 ec-canvas 组件

点击下方链接,下载 ec-canvas 组件

https://gitcode.net/mirrors/ecomfe/echarts-for-weixin/-/tree/master

将其中的 ec-canvas 文件夹拷贝到微信小程序的分包中

( 因 ec-canvas 组件较大,约 1M,若放在主包中很容易超出 2M 的大小限制,不了解分包的朋友,可以参考博文 https://blog.csdn.net/weixin_41192489/article/details/130249743)

2. 引入 ec-canvas 组件

package1\pages\account\statistics\index.json

{
  "navigationBarTitleText": "记账统计",
  "usingComponents": {
    "t-collapse": "tdesign-miniprogram/collapse/collapse",
    "t-collapse-panel": "tdesign-miniprogram/collapse-panel/collapse-panel",
    "ec-canvas": "/package1/ec-canvas/ec-canvas"
  }
}

其中的核心代码为

"ec-canvas": "/package1/ec-canvas/ec-canvas"

3. 页面中使用 ec-canvas 组件

package1\pages\account\statistics\index.wxml

<view class="titleBox">
  {{year}} 年{{month}} 月
</view>
<t-collapse value="{{activeValues}}" bind:change="cardChange">
  <t-collapse-panel value="{{0}}" header="收入( 合计 {{sumIn}} 元 )" expandIcon>
    <view hidden="{{hideInChart}}" class="container">
      <ec-canvas id="mychart1" canvas-id="mychart1" ec="{{ ec }}"></ec-canvas>
    </view>
  </t-collapse-panel>
  <t-collapse-panel value="{{1}}" header="支出( 合计 {{sumOut}} 元 )" expandIcon>
    <view hidden="{{hideOutChart}}" class="container">
      <ec-canvas id="mychart2" canvas-id="mychart2" ec="{{ ec }}"></ec-canvas>
    </view>
  </t-collapse-panel>
</t-collapse>

核心代码为

<ec-canvas id="mychart1" canvas-id="mychart1" ec="{{ ec }}"></ec-canvas>

此范例为一个页面渲染多个图表,需留意每个组件需有不同的 id

      <ec-canvas id="mychart2" canvas-id="mychart2" ec="{{ ec }}"></ec-canvas>

4. 添加必要的 css

ec-canvas 组件默认没有尺寸,需手动添加必要的 css,才能显示。

package1\pages\account\statistics\index.wxss

.container {
  position: relative;
  width: 98%;
  height: 500rpx;
  margin: 0rpx auto;
}

ec-canvas {
  position: relative;
  width: 300rpx;
  height: 400rpx;
}

.titleBox {
  font-weight: bold;
  padding-top: 30rpx;
  font-size: 40rpx;
  text-align: center;
}

5. 获取数据,渲染图表

package1\pages\account\statistics\index.js

import * as echarts from '../../../ec-canvas/echarts';

Page({
  data: {
    // 数据列表
    dataList: [],
    // 是否隐藏收入图表
    hideInChart: false,
    // 是否隐藏支出图表
    hideOutChart: false,
    // 折叠卡片的值
    activeValues: [0, 1],
    // 图表配置
    ec: {
      // 图表懒加载的必要参数
      lazyLoad: true
    },
    // 收入类型
    inTypeList: ['工资', '兼职', '理财', '其他收入'],
    // 支出类型
    outTypeList: ['衣', '食', '住', '行', '娱', '医', '学', '其他支出']
  },
  // 折叠卡片切换
  cardChange(e) {
    this.setData({
      activeValues: e.detail.value,
    });
    this.updateData()
  },
  // 更新数据状态(控制图表的显隐)
  updateData() {
    let {
      activeValues
    } = this.data
    this.setData({
      hideInChart: !activeValues.includes(0),
      hideOutChart: !activeValues.includes(1)
    })
  },
  // 分类统计收入数据
  getInResult(dataList) {
    let {
      inTypeList
    } = this.data

    let inResultDic = {}

    dataList.forEach(item => {
      inTypeList.forEach(type => {
        if (!inResultDic[type]) {
          inResultDic[type] = 0
        }
        if (item.type === type) {
          inResultDic[type] += item.money
        }
      })
    })
    let yDataList = []

    inTypeList.forEach(type => {
      yDataList.push(inResultDic[type] || 0)
    })

    this.drawChart(this.ecComponent1, inTypeList, yDataList)
  },
  // 分类统计支出数据
  getOutResult(dataList) {
    let {
      outTypeList
    } = this.data

    let outResultDic = {}

    dataList.forEach(item => {
      outTypeList.forEach(type => {
        if (!outResultDic[type]) {
          outResultDic[type] = 0
        }
        if (item.type === type) {
          outResultDic[type] += item.money
        }
      })
    })
    let yDataList = []

    outTypeList.forEach(type => {
      yDataList.push(outResultDic[type] || 0)
    })
    // 因页面宽度有限,删除支出二字
    outTypeList[7] = '其他'
    this.drawChart(this.ecComponent2, outTypeList, yDataList)
  },
  onLoad() {
    let that = this
    // 接收传入的复杂数据
    const eventChannel = this.getOpenerEventChannel()
    eventChannel.on('sendData', function (res) {
      let {
        sumIn,
        sumOut,
        sumResult,
        year,
        month,
        dataList
      } = res
      that.setData({
        sumIn,
        sumOut,
        // 月结余
        balance: sumResult,
        year,
        month,
        dataList
      })
      that.ecComponent1 = that.selectComponent('#mychart1');
      that.ecComponent2 = that.selectComponent('#mychart2');
      that.getInResult(dataList)
      that.getOutResult(dataList)
    })
  },
  // 绘制图表
  drawChart(ecComponent, xDataList, yDataList) {
    ecComponent.init((canvas, width, height, dpr) => {
      // 获取组件的 canvas、width、height 后的回调函数
      // 在这里初始化图表
      const chart = echarts.init(canvas, null, {
        width: width,
        height: height,
        devicePixelRatio: dpr
      });
      this.setOption(chart, xDataList, yDataList);

      // 注意这里一定要返回 chart 实例,否则会影响事件处理等
      return chart;
    });
  },
  // 柱状图配置
  setOption(chart, xDataList, yDataList) {
    let option = {
      xAxis: {
        type: 'category',
        data: xDataList
      },
      yAxis: {
        type: 'value'
      },
      series: [{
        data: yDataList,
        type: 'bar',
        label: {
          show: true,
          position: "top"
        }
      }]
    }
    chart.setOption(option);
  }
})

核心代码解析

  • 导入 echarts
import * as echarts from '../../../ec-canvas/echarts';
  • 获取页面图表节点
that.ecComponent1 = that.selectComponent('#mychart1');
  • 绘制图表
  // 绘制图表
  drawChart(ecComponent, xDataList, yDataList) {
    ecComponent.init((canvas, width, height, dpr) => {
      // 获取组件的 canvas、width、height 后的回调函数
      // 在这里初始化图表
      const chart = echarts.init(canvas, null, {
        width: width,
        height: height,
        devicePixelRatio: dpr
      });
      this.setOption(chart, xDataList, yDataList);

      // 注意这里一定要返回 chart 实例,否则会影响事件处理等
      return chart;
    });
  },
  • 添加图表配置
  setOption(chart, xDataList, yDataList) {
    let option = {
      xAxis: {
        type: 'category',
        data: xDataList
      },
      yAxis: {
        type: 'value'
      },
      series: [{
        data: yDataList,
        type: 'bar',
        label: {
          show: true,
          position: "top"
        }
      }]
    }
    chart.setOption(option);
  }

https://echarts.apache.org/examples/zh/index.html

目录
相关文章
预约按摩小程序开发,为什么很多上门按摩平台根本招聘不到优秀技师?
上门按摩平台面临招不到优秀技师的问题,主要原因是平台众多,技师选择多样。为解决此问题,平台可引入技师等级制度,根据订单数量和好评率划分高、低等级技师。高等级技师可享受70%-90%的高提成及首页推荐,这不仅能激励技师的积极性,还能帮助平台筛选出优质技师,提升服务质量和口碑,形成良性循环。
|
1月前
|
人工智能 小程序
【一步步开发AI运动小程序】十五、AI运动识别中,如何判断人体站位的远近?
【云智AI运动识别小程序插件】提供人体、运动及姿态检测的AI能力,无需后台支持,具有快速、体验好、易集成等特点。本文介绍如何利用插件判断人体与摄像头的远近,确保人体图像在帧内的比例适中,以优化识别效果。通过`whole`检测规则,分别实现人体过近和过远的判断,并给出相应示例代码。
|
20天前
|
开发框架 小程序 前端开发
圈子社交app前端+后端源码,uniapp社交兴趣圈子开发,框架php圈子小程序安装搭建
本文介绍了圈子社交APP的源码获取、分析与定制,PHP实现的圈子框架设计及代码编写,以及圈子小程序的安装搭建。涵盖环境配置、数据库设计、前后端开发与接口对接等内容,确保平台的安全性、性能和功能完整性。通过详细指导,帮助开发者快速搭建稳定可靠的圈子社交平台。
162 18
|
2天前
|
小程序 IDE PHP
圈子源码如何打包生成App小程序/开发一个圈子系统软件所需要的费用体现在哪里?
将PHP源码打包成App的过程涉及多个步骤和技术选择。以圈子源码为例,首先明确需求,确定App功能和目标用户群体,并根据需求开发小程序页面,如用户注册、圈子列表等。源码准备阶段确保源码适用于小程序开发,环境配置需安装IDE(如微信开发者工具)及依赖库。最后在IDE中打包小程序并上传至管理平台,通过审核后发布。费用方面,模板开发成本较低,定制开发则更高,具体取决于需求复杂度和第三方服务费用。
14 0
|
1月前
|
人工智能 小程序 UED
【一步步开发AI运动小程序】十六、AI运动识别中,如何判断人体站位?
【云智AI运动识别小程序插件】提供人体、运动及姿态检测的AI能力,本地引擎无需后台支持,具备快速、体验好、易集成等优势。本文介绍如何利用插件的`camera-view`功能,通过检测人体站位视角(前、后、左、右),确保运动时的最佳识别率和用户体验。代码示例展示了如何实现视角检查,确保用户正或背对摄像头,为后续运动检测打下基础。
|
1月前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十七、如何识别用户上传视频中的人体、运动、动作、姿态?
【云智AI运动识别小程序插件】提供人体、运动、姿态检测的AI能力,支持本地原生识别,无需后台服务,具有速度快、体验好、易集成等优点。本文介绍如何使用该插件实现用户上传视频的运动识别,包括视频解码抽帧和人体识别的实现方法。
|
2月前
|
人工智能 小程序 IDE
【一步步开发AI运动小程序】九、姿态辅助调试桌面工具的使用
随着AI技术的发展,各大厂商推出的AI运动APP如“乐动力”、“天天跳绳”等,使云上运动会、线上健身等概念大热。本文将指导你如何利用“云智AI运动识别小程序插件”,在微信小程序中实现类似功能,包括工具搭建、服务启动及数据回传等步骤,助力开发者高效开发AI运动小程序。
【一步步开发AI运动小程序】九、姿态辅助调试桌面工具的使用
|
1月前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十三、自定义一个运动分析器,实现计时计数02
本文介绍如何利用“云智AI运动识别小程序插件”开发AI运动小程序,详细解析了俯卧撑动作的检测规则构建与执行流程,涵盖卧撑和撑卧两个姿态的识别规则,以及如何通过继承`sports.SportBase`类实现运动分析器,适用于小程序开发者。
|
1月前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十二、自定义一个运动分析器,实现计时计数01
随着AI技术的发展,AI运动APP如雨后春笋般涌现,如“乐动力”、“天天跳绳”等,推动了云上运动会、线上健身等热潮。本文将指导你从零开始开发一个AI运动小程序,利用“云智AI运动识别小程序插件”,介绍运动识别原理、计量方式及运动分析器基类的使用,帮助你在小程序中实现运动计时和计数功能。下篇将继续探讨运动姿态检测规则的编写。
|
2月前
|
人工智能 JSON 小程序
【一步步开发AI运动小程序】八、利用body-calc进行姿态识别
随着AI技术的发展,各大厂商推出的如“乐动力”、“天天跳绳”等AI运动APP,使得云上运动会、线上健身等概念风靡一时。本文将引导读者从零开始开发一个AI运动小程序,使用“云智AI运动识别小程序插件”,介绍人体姿态检测规则、规则编写语法、执行检测规则运算及姿态检测实战等内容,助力开发者轻松实现AI运动小程序的开发。
【一步步开发AI运动小程序】八、利用body-calc进行姿态识别

热门文章

最新文章