小程序开发:如何给echartInit() 动态传参到data[]?

2,240 阅读2分钟

在微信小程序中使用Echarts

在小程序中如何引用ECharts: 引用方式可查看ECharts官网

在开发过程中,我们需要从后台获取需要ECharts 展示的data数据;然后传递到ec-charts 组件当中,展示最新获取到的动态图表;

微信小程序中如何给ECharts 中动态传参到data[] ?

“talk is cheap,show me the code ”

// 以下以ECharts-Pie 作为示例:

detail.wxss:


.pieContainer {
  position:absolute;
  top:60vh;
  bottom:0;
  left:18px;
  right:0;
  width:50vw;
  height:100px;
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:space-between;
  box-sizing:border-box;

} 
ec-canvas {
    width: 100%;
    height: 100%;
    /*border:1px solid red;*/
}

detail.wxml:

<view class="pieContainer">

  <ec-canvas 
  id="mychart-dom-pie" 
  canvas-id="mychart-pie"
  ec="{{ ec }}"
  bind:init="echartInit" 
  data-record="{{recordData}}">
  
  </ec-canvas>
</view>

与官网相比:

  • wxml文件中,ec-canvas标签中,比官网示例中多了一个data-record 属性;属性中绑定的是detail.js中data 数据如下:
detail.js:
// pages/detail/detail.js
import * as echarts from '../../packages/ec-canvas/echarts';

const app = getApp();
function initChart(canvas, width, height,recordData) {
    const chart = echarts.init(canvas, null, {
        width: width,
        height: height
    });

    canvas.setChart(chart);

    var option = {
        backgroundColor: "#ffffff",
        color: ["#14DA12","#DA0D07","#FFDB5C" ],
        series: [{
            label: {
                normal: {
                    fontSize: 14
                }
            },
            labelLine:{
                normal:{
                    length:5,  // 改变标示线的长度
                    lineStyle: {
                        color: "black"  // 改变标示线的颜色
                    }
                },
            },
            name:'赴约记录',
            type: 'pie',
            center: ['50%', '50%'],
            radius: [0, '60%'],
            data:[],
            itemStyle: {
                emphasis: {
                    shadowBlur: 10,
                    shadowOffsetX: 0,
                    shadowColor: 'rgba(0, 2, 2, 0.3)'
                }
            }
        }]
    };

    option.series[0].data=recordData;
    chart.setOption(option);
    return chart;
}


Page({

  /**
   * 页面的初始数据
   */
  data: {
  
      ec: {
      },
      recordData:[{
          value: 9,
          name: '赴约'
      }, {
          value: 1,
          name: '爽约'
      },{
          value: 2,
          name: '取消'
      }
      ]
  },

    echartInit(e) {
       console.log(e);
       let recordData=e.target.dataset.record;
        initChart(e.detail.canvas, e.detail.width, e.detail.height,recordData);
    },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
      this.setData({
          signature: app.globalData.accountInfo.signature
      });
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },


  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  }
})

与官网示例相比,在以上代码中:

  • function initChart(canvas, width, height,recordData);多了一个参数recordData;
  • 将option.series[0].data数组设置为空数组,并由传参的方式传递赋值:option.series[0].data=recordData;

思考总结:

在wxml中ec-chart 组件引入后,相当于一个html标签,绑定的函数仍有一样的event参数;

我们通过浏览器查看以下代码中的log日志发现:

echartInit(e) {
       console.log(e);
       let recordData=e.target.dataset.record;
        initChart(e.detail.canvas, e.detail.width, e.detail.height,recordData);
    },

e.target.dataset.record正是 detail.wxml 中的data-record 属性:

 <ec-canvas 
  id="mychart-dom-pie" 
  canvas-id="mychart-pie"
  ec="{{ ec }}"
  bind:init="echartInit" 
  data-record="{{recordData}}">
  
  </ec-canvas>
  
传递数据内容正是detail.js中的data 属性值:
recordData:[{
          value: 9,
          name: '赴约'
      }, {
          value: 1,
          name: '爽约'
      },{
          value: 2,
          name: '取消'
      }
      ]