Uniapp中集成Echarts图表的完整配置与源码修改指南

作者:开源拾贝时间:2026-10-26 06:51:50浏览:229

本文详细介绍在Uniapp项目中集成Echarts的方法。从npm安装依赖、组件目录结构调整,到关键源码修改(如处理addEventListener和preventDefault错误)以适配小程序环境,最后通过示例代码展示折线图与地图图表的配置与使用,解决交互监听问题。

在Uniapp项目中集成Echarts图表

本文以折线图为例进行说明。

在Uniapp项目中集成Echarts图表

一、视图层

绘图功能依赖于canvas标签,请务必为该标签指定一个唯一的id属性。

<template>
  <view class="dataTable">
    <u-toast ref="uToast" />
    <view class="dataTable-canvas">
      <view class="dataTable-canvas-title">
        <text>
          近七日学生上报统计
        </text>
      </view>
      <canvas id="myEcharts"></canvas>
    </view>
  </view>
</template>

二、逻辑层

<script>
// 将npm方式下载的echarts插件引入进来
import * as echarts from 'echarts';
// 接口
import { getWeekStuReport } from '@/api/dataTable/dataTable.js';
 
export default {
  data() {
    return {
      // 这里初始化一个null,待会儿用来充当echarts实例
      myChart: null,
    }
  },
  onLoad(options) {
    let that = this;
    // 通过nextTick异步画图
    this.$nextTick(() => {
      that.drawLines();
    });
  },
  beforeDestroy() {
    // 页面关闭时销毁echarts实例
    this.myChart.clear();
    this.myChart.dispose();
  },
  methods: {
    async drawLines() {
      // 这里是初始化的方式,通过id查询找到你的canvas标签
      this.myChart = echarts.init(document.getElementById('myEcharts'));
      // 这里我初始化了4个数组用来存放 后端接口给我的数据
      let data = [];
      let tian = [];
      let reportLine = [];
      let notReportLine = [];
      try {
        let res = await getWeekStuReport();
        console.log(res);
        if (res.code != 0) {
          this.$refs.uToast.show({
            title: res.message,
            type: 'error',
            duration: 3000,
          });
        } else {
          data = res.result;
          data.forEach((item) => {
            // 从接口中提取自己想要的数据
            tian.push(item.type);
            reportLine.push(item.sbNum);
            notReportLine.push(item.notSbNum);
          })
        }
      } catch (e) {
        console.log(e);
      }
 
      // 这里开始就是echarts的配置项了
      let option = {
        // x轴数据
        xAxis: {
          type: 'category',
          data: tian,
        },
        // y轴数据
        yAxis: {
          type: 'value',
        },
        // 这里写2个对象是2条线条,3个则是3条
        series: [
          {
            // data使用刚才定义的数组,数据从后端接口中取得
            data: reportLine,
            type: 'line',
            smooth: true,
          },
          {
            data: notReportLine,
            type: 'line',
            smooth: true,
          },
        ],
        grid: {
          // 这里可以防止Y轴显示不全
          containLabel: true
        }
      }
 
      // 这里不要忘记把option设置给echarts实例
      this.myChart.setOption(option);
 
      // 这里是用于窗口变化时的自适应,利用的是echarts自带的resize方法
      // 如果你打印出来这个echarts实例,可以在函数里面找到这个方法
      window.addEventListener('resize', () => {
        this.myChart.resize()
      });
    },
  },
}
</script>

三、样式设置

确保为canvas元素设置正确的宽高样式。

<style scope lang="scss">
.dataTable{
  padding: 10rpx;
  width: 100%;
  height: 100%;
  &-canvas {
    &-title {
      padding: 20rpx 0rpx;
      > text {
        padding-left: 20rpx;
        width: 100%;
        height: 100%;
        font-size: 32rpx;
        font-weight: 550;
        line-height: 32rpx;
        border-left: 10rpx solid #28b5b1;
      }
    }
    #myEcharts {
      width: 100%;
      height: 600rpx;
    }
  }
}
</style>

在uni-app微信小程序中集成echarts图表

前言:原本计划使用ucharts,但由于其无法监听图例点击交互,无法满足项目需求,因此决定改用echarts。

首先,下载echarts相关组件。可以先创建任意文件夹,执行npm init初始化项目,随后安装依赖包。

npm install echarts mpvue-echarts

接着,定位到node_modules\mpvue-echats目录下的文件结构。

在Uniapp项目中集成Echarts图表

仅保留src目录,删除其他未使用的文件(如图示部分)。然后将mpvue-echarts文件夹复制至项目的components目录中。

在Uniapp项目中集成Echarts图表

接下来需要获取echarts.min.js文件。

访问ECharts在线构建工具,根据项目需求选择图表及组件,并可选择代码压缩。将下载得到的echarts.min.js放置到项目指定位置。注意:还需要对文件内容进行修改。

必须修改echarts.min.js,否则运行时会报错“t.addEventListener is not a function”。

1. 增加相关代码

var isDomLevel2 = (typeof window !== 'undefined') && !!window.addEventListener;

具体操作如下图所示。

在Uniapp项目中集成Echarts图表

2. 修改Le和Pe函数(可通过Ctrl+F搜索定位),修改方式如下。

// An highlighted block
    function Pe(t, e, n, i) {
        if (isDomLevel2) {
            t.addEventListener(e, n, i)
        } else {
            t.attachEvent('on' + e, n)
        }
    }

    function Le(t, e, n, i) {
        if (isDomLevel2) {
            t.removeEventListener(e, n, i)
        } else {
            t.detachEvent('on' + e, n)
        }
    }

3. 全文搜索preventDefault(),在当前方法函数中增加判断逻辑(起初未修改此部分时图表显示正常,但在使用dataZoom滑动时会报错“t.preventDefault is not a function”,修改为如下代码后即可正常滑动)。

修改后的代码示例如下。

// An highlighted block
    if (isDomLevel2) {
         t.preventDefault(), t.stopPropagation(), t.cancelBubble = !0
    } else {
         t.returnValue = false;
         t.cancelBubble = !0
    }

压缩代码格式化后体积会增加一倍,因此最终未进行格式化,直接在压缩代码中找到对应位置进行修改。所需准备工作已完成,接下来开始正文部分:在页面中使用Echarts。

<template>
  <view class="echarts-wrap">
    <my-echarts
      id="main"
      ref="mapChart"
      :echarts="echarts"
      :onInit="initChart"
    />
  </view>
</template>
 
<script>
import * as echarts from "@/pages/data/static/js/echarts.min.js";  //这里根据自己存放的路径修改
import myEcharts from "@/pages/data/components/mpvue-echarts/src/echarts.vue"; //这里根据自己存放的路径修改

let chart = null;  //放外层方便拿到echart实例
export default {
  components: {
    myEcharts,
  },
  data() {
    return {
      echarts,
    };
  },
  onReady() {},
  mounted() {
    setTimeout(() => {
      chart.on("click", (params) => {  //监听图例点击事件(详细参见echart文档)
        this.$emit("chartClick", params);
      });
    }, 500);
    this.updateData() //模拟动态更新数据
  },
  methods: {
    initChart(canvas, width, height) {
      chart = echarts.init(canvas, null, {
        width: width,
        height: height,
      });
      canvas.setChart(chart);
      var option = {
        xAxis: {
          type: "category",
          data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
        },
        yAxis: {
          type: "value",
        },
        series: [
          {
            data: [120, 200, 150, 80, 70, 110, 130],
            type: "bar",
          },
        ]
      }; // ECharts 配置项(详细的图表配置参见 echart配置项)

      chart.setOption(option);

      return chart; // 返回 chart 后可以自动绑定触摸操作
    },
    updateData(){
        setTimeout(()=>{
            chart.setOption({
                series:[{
                    data:[30, 90, 111, 20, 70, 88, 11]
                }]
            })
        },1000)
    },
  },
};
</script>
 
<style>
.echarts-wrap {
  width: 100%;
  height: 300px;
}
</style>

详细的图表配置请参考Echarts官方配置项文档。最终效果如图所示。

在Uniapp项目中集成Echarts图表

至此,关于uni-app微信小程序使用echarts的介绍到此结束,更多相关小程序使用echarts内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

作者最新文章