当前位置: 首页 > article >正文

uniapp引入插件市场echarts图表(l-echart)实现小程序端图表,并修改源码简化使用

使用的uniapp插件:l-echart

https://ext.dcloud.net.cn/plugin?id=4899

注意事项

1.因为小程序有主包分包大小限制,并且uni_modules中的包也会算在主包体积中,而我项目中的图表是在分包中使用的,所以我移动uni_modules中的l-echart图表组件到分包目录组件文件夹中
2.精简echarts.min.js体积,因为需求中只需要柱图和饼图,所以我去https://echarts.apache.org/zh/builder.html下载指定的 echarts 组件压缩包,然后替换l-echart中的echarts.min.js文件,只需要500kb左右大小

页面中的用法

<template>
    <view class="charts-box">
      <l-echart ref="chart" ="init" class="charts-box"></l-echart>
    </view>
</template>

<script>
import LEchart from "@/package-pc/pages/components/lime-echart/components/l-echart/l-echart.vue";
import * as echarts from "@/package-pc/pages/components/lime-echart/static/echarts.min.js";
import option from "@/package-pc/pages/monthreport/option";
export default {
  components: {
    LEchart,
  },
  data() {
    return {
      option: option,
    };
  },
  // 使用组件的finished事件里调用
  methods: {
    async init() {
      const chart = await this.$refs.chart.init(echarts);
      chart.setOption(this.option);
    },
  },
};
</script>

<style scoped>
/* 请根据实际需求修改父元素尺寸,组件自动识别宽高 */
.charts-box {
  width: 100%;
  height: 600px;
}
</style>

第一次尝试,修改l-echart源码,简化组件用法(不推荐用法):

这样写有一个重大问题,uniapp不支持props传递的对象里面属性有function,而echarts这样的属性很多,所以不推荐这样修改源码,这里只是记录一下我尝试封装的思路过程

1.组件中直接引入echarts.min.js
2.props增加option传参
3.watch中监听option传参
4.mounted中直接执行init方法初始化图表
5.init方法中调用setOption方法
6.加入uni.onWindowResize方法监听宽高变化,然后调用原本就实现的resize方法

import * as echarts from "@/package-pc/pages/components/lime-echart/static/echarts.min.js";
export default {
  name: "lime-echart",
  props: {
    ...
    option: {
      type: Object,
    },
  },
  watch: {
    option: {
      handler() {
        this.setOption(this.option);
      },
      deep: true,
    },
  },
  mounted() {
    this.$nextTick(() => {
      this.$emit("finished");
      this.init();
    });
  },
  methods:{
  ...
   async init(...args) {
      // #ifndef APP-NVUE
      // if (arguments && arguments.length < 1) {
      //   console.error(
      //     "缺少参数:init(echarts, theme?:string, opts?: object, callback?: function)"
      //   );
      //   return;
      // }
      // #endif
      ...
      this.chart = echarts.init(
        config.canvas,
        theme,
        Object.assign({}, config, opts)
      );
      this.chart.setOption(this.option ?? {});
      uni.onWindowResize(() => {
        this.resize();
      });
      ...
    },
  }
修改后的页面用法

直接传参option给组件,请求接口后修改option即可

<template>
    <view class="charts-box">
      <l-echart :option="option1" class="charts-box"></l-echart>
    </view>
</template>

<script>
import LEchart from "@/package-pc/pages/components/lime-echart/components/l-echart/l-echart.vue";
import option from "@/package-pc/pages/monthreport/option";
export default {
  components: {
    LEchart,
  },
  data() {
    return {
      option: option,
    };
  },
  // 修改option即可
  methods: {
    async setText() {
      this.option.title.text = "test"
    },
  },
};
</script>

<style scoped>
/* 请根据实际需求修改父元素尺寸,组件自动识别宽高 */
.charts-box {
  width: 100%;
  height: 600px;
}
</style>

第二次尝试,修改l-echart源码,简化组件用法(推荐用法):

做的工作其实就是把echarts放在组件里面使用了,页面中就不用导入了,同时组件内部做了init初始化图表,页面中setOption就行了

import * as echarts from "@/package-pc/pages/components/lime-echart/static/echarts.min.js";
export default {
  name: "lime-echart",
  mounted() {
    this.$nextTick(async () => {
      await this.init();
      this.$emit("finished");
    });
  },
  methods:{
  ...
   async init(...args) {
      // #ifndef APP-NVUE
      // if (arguments && arguments.length < 1) {
      //   console.error(
      //     "缺少参数:init(echarts, theme?:string, opts?: object, callback?: function)"
      //   );
      //   return;
      // }
      // #endif
      ...
      this.chart = echarts.init(
        config.canvas,
        theme,
        Object.assign({}, config, opts)
      );
      uni.onWindowResize(() => {
        this.resize();
      });
      ...
    },
  }
修改后的页面用法
<template>
    <view class="charts-box">
       <l-echart
            ref="chart"
            :option="option"
            ="init"
            class="charts-box"></l-echart>
    </view>
</template>

<script>
import LEchart from "@/package-pc/pages/components/lime-echart/components/l-echart/l-echart.vue";
import option from "@/package-pc/pages/monthreport/option";
export default {
  components: {
    LEchart,
  },
  data() {
    return {
      option: option,
    };
  },
  // finished回调中设置option,接口请求图表数据也放在这里
  methods: {
    init() {
      this.$refs.chart.setOption(this.option);
    },
  },
};
</script>

<style scoped>
/* 请根据实际需求修改父元素尺寸,组件自动识别宽高 */
.charts-box {
  width: 100%;
  height: 600px;
}
</style>

http://www.kler.cn/a/163448.html

相关文章:

  • python实战案例——爬取A站视频,m3u8格式视频抓取(内含完整代码!)
  • 软件著作权申请教程(超详细)(2024新版)软著申请
  • C语言中的信号量semaphore详解
  • 【数据集】【YOLO】【目标检测】航拍船只识别数据集 3550 张,YOLO航拍水面船只识别算法实战训练教程!
  • AWS S3 JavaScript SDK(v3)常用操作
  • 基于MPPT最大功率跟踪的光伏发电蓄电池控制系统simulink建模与仿真
  • 文本编辑软件:Ulysses mac介绍说明
  • 老胡的周刊(第119期)
  • Java程序设计实验6 | 集合类
  • springboot(ssm寝室小卖部系统 宿舍小商店网站Java(codeLW)
  • [HITCON 2017]SSRFme perl语言的 GET open file 造成rce
  • vscode创建python虚拟环境
  • kennard-stone算法实现样本集划分(ks算法)
  • 思维链(CoT)提出者 Jason Wei:关于大语言模型的六个直觉
  • C#-快速剖析文件和流,并使用
  • 【Linux ping命令检查服务器是否可用】
  • mysql支持的整数类型、各类型整数能够表示的数值范围
  • python:mplfinance 画K线图+布林线
  • 【C++】map/multimap/set/multiset的经典oj例题 [ 盘点&全面解析 ] (28)
  • git如何配置多个远程仓库,并且进行切换
  • Qt 容器QGroupBox带有标题的组框框架
  • 二叉树的层序遍历[中等]
  • C++基础 -42- STL库之list链表
  • Qt 鼠标左键推拽界面
  • bash中通过变量中的内容获取对应的关联数组
  • Navicat 技术指引 | 适用于 GaussDB 分布式的日志查询与配置设置