当前位置: 首页 > 工具软件 > ec-ui-discuzQ > 使用案例 >

微信小程序中使用ec-canvas(包括单图表和多图表)

岳凯康
2023-12-01

微信小程序中使用ec-cavas

首先引入ec-canvas插件
首先,下载 GitHub 上的 ecomfe/echarts-for-weixin 项目。
ec-canvas 目录下有一个 echarts.js,默认我们会在每次 echarts-for-weixin 项目发版的时候替换成最新版的 ECharts。如有必要,可以自行从 ECharts 项目中下载最新发布版,或者从官网自定义构建以减小文件大小。

注意(踩坑)的点:

1 ec-canvas组件标签这里一定要设置百分比宽高,不然页面不显示

2 ec初始化渲染图表的顺序一定要在数据挂载之前,为了保证这一点,要在数据挂载那里做一个异步,不然概率性出现数据挂载在初始化渲染图表之前

3 在挂载的时候判断一下图表有没有初始化渲染上去,不然图表未初始化渲染会报错

4 一个页面写多个图表的时候不能写一个子组件然后多次调用,这样子只会显示最后一个渲染的图表,乖乖的一个一个的按照下面的这个写吧( TODO 这个多个图表的目前只找到这种写法,应该会有更优的写法,这样写的有点冗余)

单个图表
xml中

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

js中

// components/echarts/echarts.js
import * as echarts from '../ec-canvas/echarts';
const app = getApp();

//记得在这里全局声明一下
var seriesDataArr = [];
var timeArr = [];
var chart = null;

Component({
  /**
   * 组件的属性列表
   */
  properties: {
    // 数据
    seriesData: {
      type: Array,
      value: [],
      observer: function (seriesData) {
      //这里写个订阅事件去监听父组件传过来的值,
      //为什么要监听呢,因为父子间时通过调接口异步获取的数据,需要去监听一下,在onshow中是获取不到的
        if (seriesData.length > 0) {
        //这里为什么要写setTimeout呢,因为要保证下面的ec渲染初始化图表之后再来这里去调取数据挂载上去
          setTimeout(() => {
            console.log(seriesData,'关注度图表数据');
            seriesDataArr = seriesData
            this.runColumncCanva()
          }, 200)
        }
      }
    },
    // 横坐标日期
    time: {
      type: Array,
      value: [],
      observer: function (time) {
        if (time.length > 0) {
          timeArr = [];
          time.forEach(time => {
            // 去掉年份,并且以 / 显示日期
            time = [(time.split('-'))[1],(time.split('-'))[2]].join('/')
            timeArr.push(time)
          })
          this.runColumncCanva();
        }
      }
    }
  },

  /**
   * 组件的初始数据
   */
  data: {
    ec: {
      // 初始化图表
      onInit: function (canvas, width, height) {
        console.log('关注度渲染ec');
        //初始化echarts元素,绑定到全局变量,方便更改数据
        chart = echarts.init(canvas, null, {
          width: width,
          height: height
        });
        canvas.setChart(chart);
        return chart;
      }
    }
  },

  /**
   * 组件的方法列表
   */
  methods: {
    // 绘制图表
    runColumncCanva() {
      var option = {
        color: ['#37A2DA', '#67E0E3', '#9FE6B8'],
        grid: {
          containLabel: true
        },
        tooltip: {
          show: true,
          trigger: 'axis'
        },
        xAxis: {
          type: 'category',
          boundaryGap: false,
          data: timeArr,
          axisLabel:{
            rotate:45,//倾斜度 -90 至 90 默认为0
          }
        },
        yAxis: {
          type: 'value',
          splitLine: {
            lineStyle: {
              type: 'dashed'
            }
          }
        },
        series: seriesDataArr
      };
      //这里一定要做个charts是否存在的判断,因为万一ec那里没有初始化,这里就会报错
      if (chart) {
        chart.setOption(option);
      }
    }
  }
});

json文件

{
  "component": true,
  "usingComponents": {
    "ec-canvas": "../ec-canvas/ec-canvas"
  }
}
//注意的点:
// 1 这个container容器一定要设置固定宽高
.container {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: space-between;
  box-sizing: border-box;
  height: 516rpx;
  width: 611rpx;
}
// !!注意:这里也一定要设置个百分比宽高,不然图表在页面上不显示
ec-canvas {
  width: 100%;
  height: 100%;
}

多个图表

<!--pages/analysisList/components/echartList/echartList.wxml-->
<view class="echart-list flex flex-col">
  <view class="item-container">
    <view class="ec-head">
      <view class="bower-text header-text">浏览量</view>
      <view class="header-text right-text">{{browseDataCount.symbol}}{{browseDataCount.increase}}%</view>
    </view>
    <view class="ec-container" wx:if="true">
      <ec-canvas id="mychart-dom-line" canvas-id="mychart-line" ec="{{ ec1 }}"></ec-canvas>
    </view>
  </view>
  <view class="item-container">
    <view class="ec-head">
      <view class="transmit-text header-text">转发量</view>
      <view class="header-text right-text">{{transmitDataCount.symbol}}{{transmitDataCount.increase}}%</view>
    </view>
    <view class="ec-container">
      <ec-canvas id="mychart-dom-line" canvas-id="mychart-line" ec="{{ ec2 }}"></ec-canvas>
    </view>
  </view>
  <view class="item-container">
    <view class="ec-head">
      <view class="like-text header-text">点赞量</view>
      <view class="header-text right-text">{{likeDataCount.symbol}}{{likeDataCount.increase}}%</view>
    </view>
    <view class="ec-container">
      <ec-canvas id="mychart-dom-line" canvas-id="mychart-line" ec="{{ ec3 }}"></ec-canvas>
    </view>
  </view>
  <view class="item-container">
    <view class="ec-head">
      <view class="comment-text header-text">评论量</view>
      <view class="header-text right-text">{{commentDataCount.symbol}}{{commentDataCount.increase}}%</view>
    </view>
    <view class="ec-container">
      <ec-canvas id="mychart-dom-line" canvas-id="mychart-line" ec="{{ ec4 }}"></ec-canvas>
    </view>
  </view>
  <view class="item-container">
    <view class="ec-head">
      <view class="collect-text header-text">收藏量</view>
      <view class="header-text right-text">{{collectDataCount.symbol}}{{collectDataCount.increase}}%</view>
    </view>
    <view class="ec-container">
      <ec-canvas id="mychart-dom-line" canvas-id="mychart-line" ec="{{ ec5 }}"></ec-canvas>
    </view>
  </view>
  <block wx:if="{{isPost}}">
    <view class="item-container">
      <view class="ec-head">
        <view class="banner-text header-text">广告点击量</view>
        <view class="header-text right-text">{{bannerDataCount.symbol}}{{bannerDataCount.increase}}%</view>
      </view>
      <view class="ec-container">
        <ec-canvas id="mychart-dom-line" canvas-id="mychart-line" ec="{{ ec6 }}"></ec-canvas>
      </view>
    </view>
  </block>
</view>
// pages/analysisList/components/echartList/echartList.js
import * as echarts from '../../../../components/ec-canvas/echarts';
const app = getApp();

var chart1 = null
var chart2 = null
var chart3 = null
var chart4 = null
var chart5 = null
var chart6 = null

Component({
  /**
   * 组件的属性列表
   */
  properties: {
    // 数据
    dataList: {
      type: Object,
      value: {},
      observer: function (dataList) {
        if (Object.keys(dataList).length !== 0) {
          setTimeout(() => {
            let browseData = dataList.BROWSE.list
            let transmitData = dataList.TRANSMIT.list
            let likeData = dataList.LIKE.list
            let commentData = dataList.COMMENT.list
            let collectData = dataList.COLLECT.list

            if (this.data.isPost) {
              var bannerData = dataList.BANNER.list
            }
            // 左上角数据
            this.setData({
              browseDataCount: {
                increase: dataList.BROWSE.increase,
                symbol: dataList.BROWSE.symbol
              },
              transmitDataCount: {
                increase: dataList.TRANSMIT.increase,
                symbol: dataList.TRANSMIT.symbol
              },
              likeDataCount: {
                increase: dataList.LIKE.increase,
                symbol: dataList.LIKE.symbol
              },
              commentDataCount: {
                increase: dataList.COMMENT.increase,
                symbol: dataList.COMMENT.symbol
              },
              collectDataCount: {
                increase: dataList.COLLECT.increase,
                symbol: dataList.COLLECT.symbol
              },
            })
            if (this.data.isPost) {
              this.setData({
                bannerDataCount: {
                  increase: dataList.BANNER.increase,
                  symbol: dataList.BANNER.symbol
                },
              })
            }
            // 处理图表数据
            this.data.browseDataArr = []
            this.data.browseTimeArr = []
            browseData.forEach(item => {
              item.createTime = [(item.createTime.split('-'))[1], (item.createTime.split('-'))[2]].join('/'),
                this.setData({
                  browseDataArr: [...this.data.browseDataArr, item.num],
                  browseTimeArr: [...this.data.browseTimeArr, item.createTime],
                })
            })
            this.data.transmitDataArr = []
            this.data.transmitTimeArr = []
            transmitData.forEach(item => {
              item.createTime = [(item.createTime.split('-'))[1], (item.createTime.split('-'))[2]].join('/'),
                this.setData({
                  transmitDataArr: [...this.data.transmitDataArr, item.num],
                  transmitTimeArr: [...this.data.transmitTimeArr, item.createTime]
                })
            })
            this.data.likeDataArr = []
            this.data.likeTimeArr = []
            likeData.forEach(item => {
              item.createTime = [(item.createTime.split('-'))[1], (item.createTime.split('-'))[2]].join('/'),
                this.setData({
                  likeDataArr: [...this.data.likeDataArr, item.num],
                  likeTimeArr: [...this.data.likeTimeArr, item.createTime]
                })
            })
            this.data.commentDataArr = []
            this.data.commentTimeArr = []
            commentData.forEach(item => {
              item.createTime = [(item.createTime.split('-'))[1], (item.createTime.split('-'))[2]].join('/'),
                this.setData({
                  commentDataArr: [...this.data.commentDataArr, item.num],
                  commentTimeArr: [...this.data.commentTimeArr, item.createTime]
                })
            })
            this.data.collectDataArr = []
            this.data.collectTimeArr = []
            collectData.forEach(item => {
              item.createTime = [(item.createTime.split('-'))[1], (item.createTime.split('-'))[2]].join('/'),
                this.setData({
                  collectDataArr: [...this.data.collectDataArr, item.num],
                  collectTimeArr: [...this.data.collectTimeArr, item.createTime]
                })
            })
            if (this.data.isPost) {
              this.data.bannerDataArr = []
              this.data.bannerTimeArr = []
              bannerData.forEach(item => {
                item.createTime = [(item.createTime.split('-'))[1], (item.createTime.split('-'))[2]].join('/'),
                  this.setData({
                    bannerDataArr: [...this.data.bannerDataArr, item.num],
                    bannerTimeArr: [...this.data.bannerTimeArr, item.createTime]
                  })
              })
            }
            setTimeout(() => {
              this.runBrowseCanva()
              this.runTransmitCanva()
              this.runLikeCanva()
              this.runCommentCanva()
              this.runCollectCanva()
              if (this.data.isPost) {
                this.runBannerCanva()
              }
            }, 300)
          }, 200)
        }
      }
    },
    isPost: {
      type: Boolean,
      value: false,
    }
  },

  /**
   * 组件的初始数据
   */
  data: {
    ec1: {
      // 初始化图表
      onInit: function (canvas, width, height) {
        //初始化echarts元素,绑定到全局变量,方便更改数据
        chart1 = echarts.init(canvas, null, {
          width: width,
          height: height,
        });
        canvas.setChart(chart1);
        return chart1;
      }
    },
    ec2: {
      // 初始化图表
      onInit: function (canvas, width, height) {
        //初始化echarts元素,绑定到全局变量,方便更改数据
        chart2 = echarts.init(canvas, null, {
          width: width,
          height: height
        });
        canvas.setChart(chart2);
        return chart2;
      }
    },
    ec3: {
      // 初始化图表
      onInit: function (canvas, width, height) {
        //初始化echarts元素,绑定到全局变量,方便更改数据
        chart3 = echarts.init(canvas, null, {
          width: width,
          height: height
        });
        canvas.setChart(chart3);
        return chart3;
      }
    },
    ec4: {
      // 初始化图表
      onInit: function (canvas, width, height) {
        //初始化echarts元素,绑定到全局变量,方便更改数据
        chart4 = echarts.init(canvas, null, {
          width: width,
          height: height
        });
        canvas.setChart(chart4);
        return chart4;
      }
    },
    ec5: {
      // 初始化图表
      onInit: function (canvas, width, height) {
        //初始化echarts元素,绑定到全局变量,方便更改数据
        chart5 = echarts.init(canvas, null, {
          width: width,
          height: height
        });
        canvas.setChart(chart5);
        return chart5;
      }
    },
    ec6: {
      // 初始化图表
      onInit: function (canvas, width, height) {
        //初始化echarts元素,绑定到全局变量,方便更改数据
        chart6 = echarts.init(canvas, null, {
          width: width,
          height: height
        });
        canvas.setChart(chart6);
        return chart6;
      }
    },
    browseDataArr: [],
    transmitDataArr: [],
    likeDataArr: [],
    commentDataArr: [],
    collectDataArr: [],
    bannerDataArr: [],
    browseTimeArr: [],
    transmitTimeArr: [],
    likeTimeArr: [],
    commentTimeArr: [],
    collectTimeArr: [],
    bannerTimeArr: [],
    browseDataCount: {
      increase: '',
      symbol: ""
    },
    transmitDataCount: {
      increase: '',
      symbol: ""
    },
    likeDataCount: {
      increase: '',
      symbol: ""
    },
    commentDataCount: {
      increase: '',
      symbol: ""
    },
    collectDataCount: {
      increase: '',
      symbol: ""
    },
    bannerDataCount: {
      increase: '',
      symbol: ""
    },
  },

  /**
   * 组件的方法列表
   */
  methods: {
    // 绘制浏览量
    runBrowseCanva() {
      var option1 = {
        color: ["#7EFF00"],
        // 以防y轴被压缩
        grid: {
          y: 10
        },
        tooltip: {
          show: true,
          trigger: 'axis'
        },
        xAxis: {
          type: 'category',
          boundaryGap: false,
          axisLabel: {
            show: true,
            textStyle: {
              color: '#a1a1a1'
            }
          },
          data: this.data.browseTimeArr,
          // show: false
        },
        yAxis: {
          type: 'value',
          splitLine: {
            show: false
          },
          axisLabel: {
            textStyle: {
              color: '#a1a1a1'
            }
          },
          // show: false
        },
        series: [{
          name: '浏览量',
          type: 'line',
          data: this.data.browseDataArr,
        }]
      };
      if (chart1) {
        chart1.setOption(option1);
      }
    },
    // 绘制转发量
    runTransmitCanva() {

      var option2 = {
        color: ["#00FFCC"],
        // 以防y轴被压缩
        grid: {
          y: 10
        },
        tooltip: {
          show: true,
          trigger: 'axis'
        },
        xAxis: {
          type: 'category',
          boundaryGap: false,
          axisLabel: {
            show: true,
            textStyle: {
              color: '#a1a1a1'
            }
          },
          data: this.data.transmitTimeArr,
          axisLabel: {
            show: true,
            textStyle: {
              color: '#a1a1a1'
            }
          },
          // show: false
        },
        yAxis: {
          type: 'value',
          splitLine: {
            show: false
          },
          axisLabel: {
            textStyle: {
              color: '#a1a1a1'
            }
          },
          // show: false
        },
        series: [{
          name: '转发量',
          type: 'line',
          data: this.data.transmitDataArr,
        }]
      };
      if (chart2) {
        chart2.setOption(option2);
      }
    },
    // 绘制点赞量
    runLikeCanva() {
      var option3 = {
        color: ["#DE4040"],
        // 以防y轴被压缩
        grid: {
          y: 10
        },
        tooltip: {
          show: true,
          trigger: 'axis'
        },
        xAxis: {
          type: 'category',
          boundaryGap: false,
          axisLabel: {
            show: true,
            textStyle: {
              color: '#a1a1a1'
            }
          },
          data: this.data.likeTimeArr,
          // show: false
        },
        yAxis: {
          type: 'value',
          splitLine: {
            show: false
          },
          axisLabel: {
            textStyle: {
              color: '#a1a1a1'
            }
          },
          // show: false
        },
        series: [{
          name: '点赞量',
          type: 'line',
          data: this.data.likeDataArr,
        }]
      };
      if (chart3) {
        chart3.setOption(option3);
      }
    },
    // 绘制评论量
    runCommentCanva() {
      var option4 = {
        color: ["#FFB400"],
        // 以防y轴被压缩
        grid: {
          y: 10
        },
        tooltip: {
          show: true,
          trigger: 'axis'
        },
        xAxis: {
          type: 'category',
          boundaryGap: false,
          axisLabel: {
            show: true,
            textStyle: {
              color: '#a1a1a1'
            }
          },
          data: this.data.commentTimeArr,
          // show: false
        },
        yAxis: {
          type: 'value',
          splitLine: {
            show: false
          },
          axisLabel: {
            textStyle: {
              color: '#a1a1a1'
            }
          },
          // show: false
        },
        series: [{
          name: '评论量',
          type: 'line',
          data: this.data.commentDataArr,
        }]
      };
      if (chart4) {
        chart4.setOption(option4);
      }
    },
    // 绘制收藏量
    runCollectCanva() {
      var option5 = {
        color: ["#FF00FF"],
        // 以防y轴被压缩
        grid: {
          y: 10
        },
        tooltip: {
          show: true,
          trigger: 'axis'
        },
        xAxis: {
          type: 'category',
          boundaryGap: false,
          axisLabel: {
            show: true,
            textStyle: {
              color: '#a1a1a1'
            }
          },
          data: this.data.collectTimeArr,
          // show: false
        },
        yAxis: {
          type: 'value',
          splitLine: {
            show: false
          },
          axisLabel: {
            textStyle: {
              color: '#a1a1a1'
            }
          },
          // show: false
        },
        series: [{
          name: '收藏量',
          type: 'line',
          data: this.data.collectDataArr,
        }]
      };
      if (chart5) {
        chart5.setOption(option5);
      }
    },
    // 绘制广告点击量
    runBannerCanva() {
      var option6 = {
        color: ["#ffffff"],
        // 以防y轴被压缩
        grid: {
          y: 10
        },
        tooltip: {
          show: true,
          trigger: 'axis'
        },
        xAxis: {
          type: 'category',
          boundaryGap: false,
          axisLabel: {
            show: true,
            textStyle: {
              color: '#a1a1a1'
            }
          },
          data: this.data.bannerTimeArr,
          // show: false
        },
        yAxis: {
          type: 'value',
          splitLine: {
            show: false
          },
          axisLabel: {
            textStyle: {
              color: '#a1a1a1'
            }
          },
          // show: false
        },
        series: [{
          name: '广告点击量',
          type: 'line',
          data: this.data.bannerDataArr,
        }]
      };
      if (chart6) {
        chart6.setOption(option6);
      }
    },
  },

})

json

{
  "component": true,
  "usingComponents": {
    "ec-canvas": "../../../../components/ec-canvas/ec-canvas"
  }
}
/* pages/analysisList/components/echartList/echartList.wxss */
.item-container {
  height: 372rpx;
  background: #3a3a3a;
  margin: 25rpx;
}
.ec-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 30rpx 28rpx 20rpx 28rpx;
  border-bottom: 1rpx solid #333;
}

.header-text {
  font-size: 24rpx;
  line-height: 48rpx;
}
.right-text {
  opacity: 0.6;
}
.bower-text {
  color: #7EFF00;
}
.transmit-text {
  color: #00FFCC;
}
.like-text {
  color: #DE4040;
}
.comment-text {
  color: #FFB400;
}
.collect-text{
  color: #FF00FF;
}
.banner-text {
  color: #fff;
}
.ec-container {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: space-between;
  box-sizing: border-box;
  height: 280rpx;
  width: 700rpx;
}

ec-canvas {
  width: 100%;
  height: 100%;
}
 类似资料: