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

这篇具有很好参考价值的文章主要介绍了【微信小程序-原生开发】实用教程22 - 绘制图表(引入 echarts,含图表的懒加载-获取到数据后再渲染图表,多图表加载等技巧)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最终效果预览

echarts懒加载,# 微信小程序,# 已归档链接,echarts,微信小程序,柱状图

实现流程

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

1. 下载 ec-canvas 组件

点击下方链接,下载 ec-canvas 组件
https://gitcode.net/mirrors/ecomfe/echarts-for-weixin/-/tree/master

echarts懒加载,# 微信小程序,# 已归档链接,echarts,微信小程序,柱状图

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

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

echarts懒加载,# 微信小程序,# 已归档链接,echarts,微信小程序,柱状图
echarts懒加载,# 微信小程序,# 已归档链接,echarts,微信小程序,柱状图

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);
  }

想绘制其他类型的图表,参考 echarts 官网修改此配置即可
https://echarts.apache.org/examples/zh/index.html

echarts懒加载,# 微信小程序,# 已归档链接,echarts,微信小程序,柱状图文章来源地址https://www.toymoban.com/news/detail-702159.html

到了这里,关于【微信小程序-原生开发】实用教程22 - 绘制图表(引入 echarts,含图表的懒加载-获取到数据后再渲染图表,多图表加载等技巧)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用vscode开发原生微信小程序

    文章目录 前言 一、vscode需要下载哪些插件? 二、相关配置 总结 由于微信小程序开发工具的弊端,我们可以使用vscode来开发微信小程序,只需要做好一下的配置即可. 1.安装微信小程序开发助手 2.wechat-snippet 3.Easy-WXLESS 1.打开设置 在settings.json中添加以下代码 由于微信小程序开发

    2024年02月16日
    浏览(58)
  • uniapp微信小程序地图实现绘制polygon(保姆级教程 全网最全!!!)

    用户需求:需要在填写表单信息时,在地图上标绘自己房屋的位置信息。 这个问题处理了很久,在网上也没有找到全面的相关案例,所以我将我的思路分享给大家,希望可以解决大家遇到的问题。如果大家有更好的思路,欢迎评论区留言,大家一起学习,共同进步! 实现最

    2024年02月04日
    浏览(107)
  • 快速上手微信小程序(纯原生)基于微信开发者工具+云开发

    最近开发一个小程序。因为体量实在不大,两张表,几个接口。便打算写原生的代码。没有使用uniapp等框架。记录一下一个小程序从搭建到审核发布的那些坑和经验做为学习笔记。 几个网站请收藏 你的小程序需要开发工具: 保姆级传送门 你的小程序需要一个身份证: 微信公

    2024年02月10日
    浏览(85)
  • 微信小程序原生开发功能合集十六:系统主页实现

      本章实现小程序主页开发及对应逻辑处理,实现问卷填报相关功能,实现问卷查看、问卷查看、填报历史等功能的实现。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实现等内容,具体如下:   

    2024年02月10日
    浏览(48)
  • Uniapp与原生微信小程序开发区别对比

    微信小程序:(微信小程序也可以不写wx:for-index和wx:for-item,默认为index和item`) uni-app:

    2024年02月15日
    浏览(62)
  • 微信小程序原生开发功能合集二:下拉选择组件封装

      本章实现小程序中下拉选择组件的封装实现,通过自定义组件的方式实现下拉选择功能,使用小程序的picker组件实现下拉数据的展示及相关自定义处理,封装数据加载过程,数据切换逻辑监听等。   本节实现select组件的开发说明,另使用nodejs创建express服务器,为远程

    2024年02月02日
    浏览(62)
  • 微信小程序原生开发功能合集十二:编辑界面的实现

      本章实现编辑界面的实现处理,包括各编辑组件的使用及添加数据保存数据流程的实现处理。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实现等内容,具体如下:    1. CSDN课程: https://edu.csdn.ne

    2024年02月02日
    浏览(61)
  • UniApp项目中 使用微信小程序原生语言 进行开发

    wxcomponents 下放的是微信小程序原生代码写的组件。我进行了封装 在你下uniApp 项目的根目录创建一个 wxcomponents 名字千万不要错 京东、支付宝灯参考下面图片 官方文档也有介绍 然后在你需要引入原生功能的页面里面引入你的组件(我这里提前已经放过来了。在上面图可看到

    2024年02月04日
    浏览(75)
  • 微信小程序原生开发功能合集十五:个人主页功能实现

      本章个人主页功能实现,展示当前登录用户信息、个人主页、修改密码、浏览记录、我的收藏、常见问题、意见反馈、关于我们等界面及对应功能实现。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实

    2024年02月06日
    浏览(89)
  • 【微信小程序-原生开发】添加自定义图标(以使用阿里图标库为例)

    优点:操作方便,支持多彩图标 缺点:会增加源代码大小 下载 svg 格式的图标图片,放入源码中使用 小程序项目中的路径为 assetsicon美食.svg 优点:不会增加源代码大小 缺点:不支持多彩图标,更新比较麻烦 将图标添加到自己的图标项目中后,生成对应的 css 链接 浏览器打

    2024年02月11日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包