天天看点

ec-canvas 在小程序上的使用

ec-canvas 在小程序上的使用

I. 前言

echarts、ec-canvas,在小程序中进行数据可视化的意义

Echarts 是一款由百度开发和维护的的数据可视化工具库,其提供了各种类型的图表和交互式组件,同时支持动态数据更新和动画效果等功能。通过使用 Echarts,用户可以简单、快速地构建可视化图表和交互式组件,帮助用户更好地理解和展示大量的数据信息。而 ec-canvas 是 Echarts 专门针对小程序开发的图表库,通过提供对小程序原生 canvas 属性的封装和优化,从而达到将 Echarts 功能转化为小程序能够识别的 Api,从而实现在小程序中进行数据可视化的目的。

在小程序中进行数据可视化,可以帮助用户直观地展示数据,提高数据解读和分析的效率,同时让用户可以通过简单的手势操作,进行数据的筛选、比较和分析等操作,方便用户对数据的处理和挖掘,进而为用户提供更全面、精准的决策依据,帮助用户更好地理解和处理数据。此外,小程序作为一种轻量级、交互性强的移动应用程序,在访问速度、用户使用习惯等方面相较于传统的 PC 和 Web 端应用具有更为优越的使用体验。因此,将 Echarts 库和 ec-canvas 组件运用到小程序中,可以充分利用小程序的优点,来实现数据的可视化展示和业务逻辑功能的实现。

II. 安装ec-canvas

1. 下载安装ec-canvas组件

在小程序中使用 echarts 需要下载安装 ec-canvas 组件。

下面简单介绍 ec-canvas 的安装流程。
  1. 打开 Github ec-canvas 项目页面:https://github.com/ecomfe/ec-canvas。
  2. 点击Clone or download,选择Download ZIP来下载 ec-canvas 组件。
  3. 解压缩下载的 ZIP 文件,打开解压缩后的文件夹,可以看到其中包含一个名为 ec-canvas 的文件夹,其中包含了 ec-canvas 组件的主要代码。
  4. 将 ec-canvas 文件夹中的文件复制到您小程序项目的相应目录下,一般为 /components/ec-canvas。
  5. 在小程序页面的 json 配置文件中添加 "usingComponents" 对象,以便能够在页面中引用 ec-canvas 组件。例如:
  6. { "usingComponents": { "ec-canvas": "/components/ec-canvas/ec-canvas" } }
  7. 在小程序页面的 wxml 文件中,即可通过标签<ec-canvas>引用 ec-canvas 组件。

总之,下载安装 ec-canvas 组件非常简单,只需要在 Github 上下载该组件,并将其导入到小程序项目中即可。

2. 配置组件参数

安装完成 ec-canvas 组件后,需要进行参数配置,才能正确的使用。以下是 ec-canvas 组件的几个主要参数:

  1. canvas-id: Canvas 的 id,用于在 js 中获取 Canvas 对象。
  2. ec-parameter: 将 echarts 配置信息以 json 类型传入 ec-canvas 组件中,这个参数很重要。
  3. disable-scroll: 是否禁止页面滑动,默认值为 false。
针对这些参数,以下是如何正确地进行配置:

1. 设置 canvas-id

将在小程序页面引用 ec-canvas 组件的标签的 canvas-id 属性设置为一个字符串,名称可以任意指定,例如:

<ec-canvas canvas-id="mychart"></ec-canvas>
           

2. 设置 echarts 配置信息

将 echarts 的配置信息以 json 形式传入 ec-canvas 组件中。这个配置信息需要在 wxml 中通过绑定 data 值进行传递,例如:

<ec-canvas id='mychart-dom-line'
  canvas-id='mychart-line'
  ec:canvas-id='mychart-line'
  ec:binderror='onError'
  ec:show-tooltip='true'
  ec:enable-pinch-zoom='true'
  ec:touch-move-limit='20' 
  ec:scale-mode='aspectFit'
  ec:animation-duration='500'
  ec:categories='{{categories}}'
  ec:series='{{series}}'
  onInit='initChart'>
</ec-canvas>
           

上述代码中,绑定了 ec:categories 和 ec:series 两个参数,其中 categories 和 series 分别表示图表的类别信息和数据信息。这些参数的具体含义和用法请参考 echarts 官方文档。

3. 禁止页面滑动

如果不希望通过手势滑动页面来滚动小程序中的 echarts 图表,可以在 ec-canvas 组件上设置 disable-scroll 属性:

<ec-canvas canvas-id="mychart" disable-scroll="{{true}}"></ec-canvas>
           

经过以上配置后,即可在小程序中愉快的使用 echarts 组件啦!

III. 初识ec-canvas

1. echarts在微信小程序中的工作原理

ECharts 是一个基于 JavaScript 的开源可视化图表库,它可以支持在 Web 应用中使用,并且也可以在移动端应用中进行使用。为了将 ECharts 应用于微信小程序中,需要进行以下步骤:

1. 安装 echarts-for-weixin 库包

npm install echarts-for-weixin --save
           

2. 导入 echarts 库,并创建图表实例

<canvas id="myChart"></canvas>
           
const echarts = require('echarts-for-weixin');
const chart = echarts.init(this.selectComponent('#myChart').canvas);
           

3. 配置图表参数

const options = {
  title: {
    text: 'ECharts 入门示例'
  },
  tooltip: {},
  legend: {
    data:['销量']
  },
  xAxis: {
    data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
  },
  yAxis: {},
  series: [{
    name: '销量',
    type: 'bar',
    data: [5, 20, 36, 10, 10, 20]
  }]
};

chart.setOption(options);
           

4. 渲染图表

this.selectComponent('#myChart').canvasToTempFilePath({
    success(res) {
        console.log(res.tempFilePath);
    },
    fail(res) {
        console.log(res);
    },
    complete(res) {
        console.log(res);
    }
}, this);
           

以上便是使用 ECharts 在微信小程序中进行开发的基本步骤。富有表现力的可视化数据是许多小程序所需的关键业务应用,ECharts 可以提供丰富的体验以及良好的交互设计。

2. echarts小程序版的局限性与创新点

ECharts小程序版相比于Web版有一些局限性。其中主要包括以下几点:
  1. 图表类型受限: 在小程序中,ECharts的支持的图表类型会受到一定程度的限制。
  2. 静态绘制: 小程序中的canvas画布可以通过调用draw方法直接将图表绘制在画布上,但这种绘制方式不支持交互事件的响应。
  3. 性能限制:小程序本身的功能以及性能受限,使用ECharts可能会对小程序整体性能造成一定影响。
但是,ECharts小程序版也有一些创新点:
  1. 借助微信小程序提供的开发者工具,通过调用微信小程序的API,可以实现小程序与ECharts的深度结合,提供更好的用户体验。
  2. ECharts小程序版的库包体积较小,轻量化特点能更好地适应小程序开发所需。
  3. 通过集成ECharts可视化库,能够实现数据可视化,方便用户对数据进行更具深度的分析。

3. 通过一个简单的示例了解ec-canvas的基本用法

下面是一个简单的示例,用于创建一个柱状图:

1. 在小程序页面的json文件中注册canvas

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

2. 在小程序页面中引入echarts库

import * as echarts from '../../utils/echarts.min.js'
           

3. 在小程序页面wxml文件中放置ec-canvas组件

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

4. 在小程序页面js文件中创建图表实例,并进行相关配置与渲染

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

function initChart(canvas, width, height) {
  const chart = echarts.init(canvas, null, {
    width: width,
    height: height
  });
  canvas.setChart(chart);
  
  const option = {
    color: ['#3398DB'],
    tooltip: {
      trigger: 'axis',
      axisPointer: {
        type: 'shadow'
      }
    },
    grid: {
      left: '3%',
      right: '4%',
      bottom: '3%',
      containLabel: true
    },
    xAxis: [
      {
        type: 'category',
        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
        axisTick: {
          alignWithLabel: true
        }
      }
    ],
    yAxis: [
      {
        type: 'value'
      }
    ],
    series: [
      {
        name: '直接访问',
        type: 'bar',
        barWidth: '60%',
        data: [10, 52, 200, 334, 390, 330, 220]
      }
    ]
  };

  chart.setOption(option);
  return chart;
}
           

以上便是通过 ec-canvas 实现一个简单柱状图的流程,具体步骤包括创建canvas、初始化ECharts实例、配置ECharts参数、渲染图表等过程。

IV. 使用ec-canvas绘制图表

1. 根据echarts各组件属性设置ec-canvas参数

ec-canvas会将ECharts实例中的option参数解析为对应canvas的属性来渲染图表。根据不同组件的属性,ec-canvas会将option参数解析为对应的canvas参数。

以下是ec-canvas中使用到的一些属性参数及其对应的ECharts配置项:
  • canvas: canvas自身的属性,例如id、style等。
  • subtitle: 副标题的相关属性,例如textStyle。
  • yAxis: 直角坐标系中y轴的相关属性,例如axisLine、axisTick、axisLabel、splitLine、min、max等。
  • xAxis: 直角坐标系中x轴的相关属性,例如axisLine、axisTick、axisLabel、splitLine等。
  • tooltip: 提示框组件的相关属性,例如trigger、formatter、axisPointer等。
  • grid: 直角坐标系内绘图网格的相关属性,例如left、right、top、bottom、width、height、containLabel等。
  • series: 数据系列的相关属性,例如symbol、symbolSize、itemStyle等。

通过在option参数中设置相应属性,可以改变ECharts图表的展现形式。例如,可以通过设置xAxis中的axisLine、axisTick以及axisLabel属性来自定义x轴,通过设置tooltip属性来定制提示框的样式等。

总之,在使用ec-canvas中,需要熟悉各个组件的参数属性,以及对应的ECharts配置项,以便将canvas上的图表效果与设计要求相匹配。

2. 配置图表的样式、类型、数据

在echarts中,通过配置option对象来配置图表样式、类型、数据。

option对象是一个包含各种配置参数的json对象,包含多个属性,每个属性对应不同的配置项,比如:标题、x轴、y轴、数据等。

下面是一个简单的示例,用于创建一个柱状图例子:
// 引入 ECharts 主模块
import * as echarts from '../../ec-canvas/echarts';

Page({
  onLoad: function (options) {
    this.setData({
      ec: {
        // 组件 ID
        id: 'chart1',
        // canvas 宽度,单位为px
        width: 360,
        // canvas 高度,单位为px
        height: 240,
        // ECharts配置项
        option: {
          // 图表的标题
          title: {
            text: '销售量'
          },
          // 柱状图
          series: [{
            type: 'bar',
            data: [5, 20, 36, 10, 10, 20]
          }]
        }
      }
    });
  }
})
           

在上面的代码中,我们通过在data中设置一个ec对象,然后在onLoad函数中更新这个对象的值。ec对象包含了组件的ID、宽度、高度和option对象。在option中,我们定义了图表的标题和一个柱状图。其中柱状图的数据为一个长度为6的数组,每个值对应一个柱子的高度。

可以看出,通过简单地配置option对象,我们就可以完成数据的设置和图表的样式定制。可以根据ECharts的文档和API进一步了解图表类型、数据格式以及各种美化操作。

3. 使用setOption方法刷新图表

如果需要更新已经绘制的图表,可以使用setOption方法。

例如,在一个柱状图中,我们可以通过点击按钮,动态地更新数据。

完整的代码示例如下:
import * as echarts from '../../ec-canvas/echarts';

let chart = null;

function initChart(canvas, width, height) {
  chart = echarts.init(canvas, null, {
    width: width,
    height: height
  });
  canvas.setChart(chart);
  
  const option = {
    title: {
      text: '销售量'
    },
    xAxis: {
      type: 'category',
      data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
    },
    yAxis: {
      type: 'value'
    },
    series: [{
      type: 'bar',
      data: [5, 20, 36, 10, 10, 20, 8]
    }]
  };

  chart.setOption(option);
  return chart;
}

Page({
  data: {
    ec: {
      onInit: initChart
    }
  },
  updateChart: function() {
    const option = {
      series: [{
        data: [15, 30, 46, 20, 20, 30, 18]
      }]
    };
    chart.setOption(option);
  }
})
           

在上面代码中,使用initChart函数初始化图表,设置了初始option。数据系列中的data用一个长度为7的数组来定义,表示每一个数据点对应的显示值。在updateChart函数中,通过更改数据系列中的data数组,用setOption方法更新图表的数据。当触发按钮点击事件时,调用updateChart函数实现图表的刷新。只需要更改视图中图表对应的option,再调用 setOption 方法进行更新即可。

当然,除了数据的更新,你还可以使用 setOption 函数来更新其他样式配置,比如标题、坐标系、图例、标记等。

4. 修改图表的参数并刷新画面

要修改图表参数并刷新画面,可以使用以下两种方式:

方式一:直接更新option

可以使用 chart.getOption() 获取当前图表参数,修改需要修改的属性后,再用 chart.setOption(option) 方法设置当前参数并刷新画面。

例如:

const option = chart.getOption();
option.title.text = "新标题";
option.xAxis[0].data = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
chart.setOption(option);
           

上述代码中,我们首先使用 getOption 方法获取了当前图表的 option 参数,然后修改了参数中的 title 和 xAxis,最后使用 setOption 方法将新的参数设置并刷新画面。这里修改了标题和x轴,其他的配置同理。

方式二:通过onInit方法更新option

通过修改onInit方法的调用参数,可以进行视图的刷新和重新绘制。

例如:

let chart = null;

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

  this.setData({
    chart: chart
  });

  const option = {
    /* ...填写具体配置项 */
  };

  chart.setOption(option);
}

function updateChart() {
  const option = {
    /* ...填写修改后的配置项 */
  };
  this.setData({
    ec: {
      onInit: initChart.bind(this),
      lazyLoad: true,
      option: option
    }
  });
}
           

如上述代码,我们首先声明了一个chart变量,用于保存图表实例。在onInit方法中,除了常规配置项外,还通过setData方法将创建好的图表实例传给了this.data,这样我们就可以随时获取chart实例进行操作。

在updateChart函数中,通过setData方法将新的option对象传递给了ec-canvas组件,同时在onInit方法中获取最新的option,并进行了重新绘制操作。

注意:在使用这种方式时,需要将 lazyLoad 属性设置为 true,这样 ec-canvas 组件才会调用 onInit 方法,进行更新操作。

综上,通过修改 option 参数,或者重新调用 onInit 方法,我们就可以更新图表的参数并刷新画面了。不同的修改方式,可以根据具体场景进行选择。

V.优化echarts小程序版体验

1. 图表响应式适配

ECharts 在支持多种图表类型和丰富的配置选项的同时,也提供了响应式布局方案。

下面是一些常用的 ECharts 响应式适配方案:

  1. 使用resize方法:

通过监听窗口尺寸变化事件,然后使用 chart.resize() 方法重新渲染图表。

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

Page({
  onLoad: function (options) {
    this.setData({
      ec: {
        id: 'mychart',
        option: {},
        onInit: function (canvas, width, height, dpr) {
          const chart = echarts.init(canvas, null, {
            width: width,
            height: height,
            devicePixelRatio: dpr
          });
          this.chart = chart;
          chart.setOption(this.getOption());
          return chart;
        }
      }
    });
  },

  onReady: function () {
    // 监听窗口尺寸变化事件,执行 resize 方法重新渲染图表
    wx.onWindowResize(() => {
      this.chart && this.chart.resize();
    });
  },

  getOption: function () {
    return {...}
  },
});
           
  1. 使用grid属性指定图表大小:

通过在 grid 属性中指定图表长和宽的百分比,实现图表响应式布局。

const option = {
  title: {
    text: '响应式布局示例'
  },
  grid: {
    width: '80%', // 宽度占 80%
    containLabel: true // 包含刻度标签

  },
  xAxis: {...},
  yAxis: {...},

  series: {...}

};
           
  1. 使用media数据集:

可以在 option.media 中设置多组属性,这些属性将覆盖option中的配置项。通过配置media数据集,可以根据窗口大小,按照不同的宽度,采用不同的配置项。

const option = {
  baseOption: {...},
  media: [
    {
      option: {
        grid: {
          width: '90%'
        },
        series: [{
          type: 'bar',
          barWidth: 20
        }]
      }
    },
    {
      query: {
        minWidth: 800
      },
      option: {
        grid: {
          width: '50%'
        },
        series: [{
          type: 'bar',
          barWidth: 30
        }]
      }
    }
  ]
};
           

在上面的代码中,我们定义了两个media的数据集,分别适用于宽度小于800px和大于800px的场景。通过在media的配置中设置 query 和 option ,可以实现窗口大小判定和对应的配置项设置。

  1. 使用flex布局:

重头戏来啦!相比于前面的几种方式来说,flex 布局具有更强大的响应式适配能力。

<view class='chart-container'>
  <ec-canvas id='mychart-canvas' canvas-id='mychart-canvas' ec="{{ ec }}" />
</view>
           
.chart-container{
  display: flex;
  width: 100%;
  height: 400rpx;
}
           
const option = {...}

Page({
  ...
  getOption() {
    if (someCondition) {
      option.title.text = '第一种配置项';
    } else {
      option.title.text = '第二种配置项';
    }
    return option;
  }
});
           

在上面的代码中,我们使用CSS flex布局和onInit中的option配置来实现图表的响应式适配。

具体来说,我们将 ec-canvas 组件放置在一层 div 容器中,然后通过设置它的 display 属性为 flex,以父容器的宽度为基准,进行图表的自适应展示。

同时我们也可以通过在 getOption() 方法中,对不同的情况返回不同的配置项,以针对不同的屏幕大小进行设置。

2. echarts小程序版的性能与问题解决方案

ECharts 微信小程序版是 ECharts 官方提供的一款专为微信小程序定制和优化的图表库,拥有跨平台使用、数据可视化、图表丰富等特点,同时在性能、稳定性等方面也做了不少优化。

但是,即便是经过了优化,ECharts在微信小程序的使用过程中,也会出现一些问题,例如初始加载慢、过度渲染、内存泄漏等。这里介绍一些常见性能问题及对应解决方案:

1. 初始加载慢

经常会出现由于数据量过大、初始化过程中的复杂计算和渲染等原因,导致图表初始加载过慢的情况。这时可以通过一些措施来缓解这种情况:

  • 使用缓存

可以通过在后端缓存数据,前端通过 AJAX 调用数据,然后利用 chart.clear() 和 chart.load() 的数据更新方法来刷新页面。

  • 懒加载

可以通过设置 lazyLoad 属性为 true,当视口进入范围内时才会初始化图表,避免不必要的初始计算和渲染。

  • 数据优化

优化单条数据的显示方式,比如横轴坐标的旋转和隐藏、数据的饼图标签重叠等。

2. 过度渲染

过度渲染是指当数据过多时,渲染所需的时间就会变得十分长,导致页面出现卡顿和操作响应不及时等问题。这里有几个解决方案:

  • 数据分段

针对数据量大的问题,可以将数据分段展示,比如分段渲染大数据量的折线图、柱状图等。

  • 图表共用

将数据分散到多个图表中展示,互不重叠、互相协作,降低单个图表的数据负荷。

  • 动态渲染

对于连续-flow 的数据,可以通过动态渲染方式,来减轻一次性渲染的负担,且互动体验不会影响整体性能。

3. 内存泄漏

内存泄漏是一个普遍存在且引发疑难问题的情况,通常会导致页面卡顿,甚至直接崩溃的情况。解决方案可以是手动释放资源、开启回收机制、优化赋值操作等:

  • 手动释放

在onUnload方法中,释放对chart实例的引用。应避免在视图销毁之前,持有图表实例的引用,以便系统可以释放图表的相关资源。

  • 启用分级回收算法

可以在图表初始化的anchorOption中开启 animationThreshold 配置项,以便可以在不同的动画阈值下显示动画。

  • 优化赋值操作

对于复杂的图表或需要 frequent 数据更新的特殊图表类型,可以考虑避免使用直接赋值数据的方式。可以通过合理的数据处理以及增量更新等方式来减轻渲染压力。

以上是一些常见的问题和解决方案,但在实际开发过程中,遇到的问题和解决方案还有很多,也需要根据实际情况进行优化,以提高用户体验和性能。

3. 减少echarts小程序版体积的五种方法

VI. 结语

1. 如何使用ec-canvas实现小程序中的数据可视化

在微信小程序中,由于代码体积的限制,我们需要考虑对 ECharts 进行体积优化,以便能够更好地适应微信小程序的开发。

以下是几个常见的 ECharts 体积优化方案:

1. 异步加载:

可以使用 importScript 或者 wx.request 异步加载,只有当数据请求成功后,才会进行图表的渲染,从而实现按需加载。这种方式不仅可以缩短初始加载时间,还可以根据需求动态加载图表模块。

2. 按需引入:

ECharts 库包含了很多组件和功能,但实际应用场景中,并不一定都需要用到。因此,按需引入需要的组件,可以有效地减小 ECharts 库的体积。可以通过在page.json中配置:

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

或者在页面内使用import动态引入:

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

3. 离线打包:

通过使用 ECharts 的离线打包功能(Optimized ECharts),可以在保证功能不变的前提下,将体积从原来的 1.1MB 降低到 300KB 左右。在官网上下载离线打包文件,然后直接引入即可。

4. 使用 gzip:

在使用 ECharts 库时,提供给前端的 JS 文件可以通过压缩(gzip)来减小体积。服务器返回时,先判断用户的请求是否支持 gzip 压缩,如果支持,则返回 gzip 压缩后的 JS 文件。

5. 使用 CDN:

在开发过程中,如果遇到体积过大的 ECharts 库,可以考虑使用 CDN。CDN 服务商会对一些文件进行大量的缓存,以备下一次使用。这种方式可以缓解压缩包文件过大的问题,将 ECharts 库的体积大大减小。

综上所述,五种方法可以帮助我们在微信小程序中减少 ECharts 库的体积,提高用户的使用体验及性能,可以根据实际情况选择其中一种或多种方法进行实现。

2. 小程序版的echarts在性能、使用上的不断优化

ECharts 微信小程序版是 ECharts 官方提供的一款专为微信小程序定制和优化的图表库。在开发者不断的反馈和贡献下,ECharts小程序版也在不断地进行性能和使用上的优化。

下面是ECharts小程序版的性能和使用上的不断优化:

1. 增加懒加载机制:

懒加载机制是指,当组件进入可视区域时才进行初始化绘制。这样既能够优化初始加载性能,又能避免引起过度渲染等问题,提高用户体验。

2. Layout性能优化:

对于常见图表类型(如折线图、柱状图等),通过 Layout 布局调整、优化和缓存,可以在不影响图表展示效果的前提下,大大提高渲染性能。

3. 提高绘图性能:

通过 Canvas 的底层操作和微信小程序中的自定义组件技术,ECharts 微信小程序版大大提高了绘制性能和渲染效果。

4. 完善文档和示例:

ECharts 微信小程序版还提供了完善的文档和大量示例代码,可以帮助开发者更好地掌握使用技巧和最佳实践。

5. 主动响应问题和需求:

ECharts 小程序版的开发团队一直密切关注开发者的反馈和需求,通过 GitHub Issue 等渠道,积极响应问题和需求,及时提供技术支持和解决方案。

综上所述,ECharts 微信小程序版在性能和使用方面的不断优化,为开发者提供了更好的体验和更高的效率,帮助开发者更好地完成微信小程序的数据可视化需求。