IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 在微信小程序中使用echarts以及遇到的问题 -> 正文阅读

[移动开发]在微信小程序中使用echarts以及遇到的问题

一、 echarts使用步骤

1、下载

https://github.com/ecomfe/echarts-for-weixin.

2、引入组件

将下载好的组件放入小程序根目录,如图
在这里插入图片描述

3、页面简单使用

index.json
在需要用到echarts页面的.json文件中添加以下配置

"usingComponents": {
    "ec-canvas": "../../ec-canvas/ec-canvas"
  }

路径可以根据自己实际情况调整

index.wxml
在要使用的页面index.wxml 中,我们创建了一个 组件,内容如下:

<view class="container">
  <ec-canvas id="mychart-dom-bar" canvas-id="mychart-bar" ec="{{ ec }}"></ec-canvas>
</view>

index.js
其中 ec 是一个我们在 index.js 中定义的对象,它使得图表能够在页面加载后被初始化并设置。index.js 的结构如下:

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

function initChart(canvas, width, height, dpr) {
  const chart = echarts.init(canvas, null, {
    width: width,
    height: height,
    devicePixelRatio: dpr // 像素
  });
  canvas.setChart(chart);

  var option = {
    ...
  };
  chart.setOption(option);
  return chart;
}

Page({
  data: {
    ec: {
      onInit: initChart
    }
  }
});

index.wxss

ec-canvas {
  width: 100%;
  height: 100%;
}
.container {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
}

4、封装组件

组件index.wxml

<view style="height: {{ height }};width:100%">
      <ec-canvas id="{{ chartLineId }}" canvas-id="{{ canvasId }}" ec="{{ec}}" options="{{options}}"></ec-canvas>
</view>

组件index.js

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

Component({
  /**
   * 组件的属性列表
   */
  properties: {
    chartLineId: {
      type: String
    },
    canvasId: {
      type: String
    },
    height: {
      type: String
    },
    options: {
      type: Object
    },
    isshow:{ // 是否首次加载
      type:Boolean
    }
  },

  /**
   * 组件的初始数据
   */
  data: {
    ec: {
      lazyLoad: true, // 延迟加载
    },
  },
  lifetimes: {
    ready() {
      this[this.data.chartLineId] = this.selectComponent('#' + this.data.chartLineId);
      this.isshow?this.initChart():''  // 因为自己项目有在弹框里面展示echarts的,有页面加载直接展示的,所以这里有区分。
    },
    detached(e) {
      this[this.data.chartLineId] = null
      this[this.data.canvasId] = null
    },
  },
  /**
   * 组件的方法列表
   */
  methods: {
    initChart() {
      this[this.data.chartLineId].init((canvas, width, height, dpr) => {
        const chart = echarts.init(canvas, null, {
          width: width,
          height: height,
          devicePixelRatio: dpr // new
        })
        chart.setOption(this.data.options)
        return chart
      })
    }
  }
})

在页面使用index.wxml

<block wx:for="{{optionData}}" wx:key="index">
    <chart isshow="false" id="chart{{index}}" options="{{item.options}}" canvasId="mychart-id" chartLineId="mychart{{index}}" height="400rpx"></chart>
</block>

在页面使用index.js

data: {
	optionData: [], // echarts data
}

onLoad: function (options) {
	this.getChartsData(true)
}
/**
* method
*/
    // 请求echarts图标数据
    getChartsData(type) {
        queryGtAndDiffListApi().then(res => {
            res.gtAndDiffWeeksDTOList.forEach(item => { // 处理接口数据
                item.data1 = [item.weCTotal, item.wePTotal, item.weNTotal]
                item.data2 = [item.gtCTotal, item.gtPTotal, item.gtNTotal]
            })
            if (type) {  // 这里是区分首次加载还是分页下拉加载数据
                this.setData({
                    'filterPage.total': res.total,
                    'optionData': res.gtAndDiffWeeksDTOList
                })
            } else {
                this.setData({
                    'filterPage.total': res.total,
                    'optionData': [...this.data.optionData, ...res.gtAndDiffWeeksDTOList]
                })
            }
            setTimeout(() => {
                this.setOption()
            }, 200);
        })
    },
    setOption() {
        for (let i = 0; i < this.data.optionData.length; i++) {
            this.data.optionData[i].options = this.getOption(this.data.optionData[i].weekEndingEn, this.data.optionData[i].data1, this.data.optionData[i].data2)
            data = this.data.optionData
            this.chart = this.selectComponent(`#chart${i}`);
            this.setData({
                optionData: this.data.optionData
            })
            this.chart.initChart()
        }
    },
    getOption(title, data1, data2) {
        let opation = {
            title: {
                text: 'Weekend: ' + title,
                padding: 30,
                textStyle: {
                    color: '#000000',
                    fontSize: '30rpx',
                },
            },
            grid: {
                left: '2%',
                right: '2%',
                bottom: '3%',
                containLabel: true
            },
            yAxis: {
                type: 'value',
            },
            xAxis: {
                type: 'category',
                data: ['C', 'P', 'N']
            },
            series: [{
                    name: '2011年',
                    type: 'bar',
                    color: '#E9E9E9',
                    data: data1
                },
                {
                    name: '2012年',
                    type: 'bar',
                    color: '#FFE600',
                    data: data2
                }
            ]
        }
        return opation
    }   

效果展示 : 底下echarts是分页展示的,下滑继续加载
在这里插入图片描述

二、遇到问题

1、使用echarts不跟随父元素滑动的问题

这个问题的现象说起来很简单。
小程序页面中底部有Echarts图表,手指上下滑动观看内容。但是手指滑动区域在Echarts图表上时,页面却不能滑动了。
个人认为是小程序的canvas在加载的时候只展示页面可视区域的图表,在网上查了很多办法都没有解决,最后在一位大佬的建议下自己摸索出来了

最终解决方案
用scroll-view将echarts要显示的区域包裹,在每次页面滚动时触发bindscroll函数,重新加载echarts图表
代码如下:
bindscroll是每次滚动时触发的这里调一下echarts
bindscrolltolower是滚动到底部时触发这里是做分页的

<scroll-view scroll-y="true" bindscroll="scroll" bindscrolltolower="scrolltolowe" style="height:75%;">
        <!-- echart -->
        <view class="chart-box">
          <block wx:for="{{optionData}}" wx:key="index">
            <view class="chart-item">
              <navigator url="../GTEWeekDiff/index?week={{item.weekEnding}}&weekEn={{item.weekEndingEn}}&&year={{year}}&&gpn={{gpn}}"
                hover-class="none">
                <chart isshow="false" id="chart{{index}}" options="{{item.options}}" canvasId="mychart-id"
                  chartLineId="mychart{{index}}" height="400rpx">
                </chart>
              </navigator>
            </view>
          </block>
        </view>
      </scroll-view>




   // echarts 滚动时
    scroll(e) {
        clearTimeout(this._st)
        this._st = setTimeout(() => {
            this.setOption()
        }, 100);
    },

    // echarts下拉事件
    scrolltolowe() {
        if (this.data.filterPage.pageNum * this.data.filterPage.pageSize < this.data.filterPage.total) {
            this.setData({
                'filterPage.pageNum': this.data.filterPage.pageNum + 1
            })
            this.getChartsData(false)
        }
    },

最终完美的解决了问题 ,在安卓和IOS都没问题,亲测有效如上图

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-10-29 13:09:42  更:2021-10-29 13:10:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:09:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码