uniapp引入插件市场echarts图表(l-echart)实现小程序端图表,并修改源码实现watch监听option

使用的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左右大小

页面中使用的用法
dart 复制代码
<template>
    <view class="charts-box">
      <l-echart ref="chart" @finished="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源码,简化组件用法:

1.组件中直接引入echarts.min.js

2.props增加option传参

3.watch中监听option传参

4.mounted中直接执行init方法初始化图表

5.init方法中调用setOption方法

6.加入uni.onWindowResize方法监听宽高变化,然后调用原本就实现的resize方法

js 复制代码
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(async () => {
      this.$emit("finished");
      await 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即可

dart 复制代码
<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>
相关推荐
数字游民952716 小时前
2小时VibeCoding了一个看图猜词小程序:猜对了么
人工智能·ai·小程序·ai绘画·数字游民9527
我即将远走丶或许也能高飞16 小时前
vuex 和 pinia 的学习使用
开发语言·前端·javascript
钟离墨笺17 小时前
Go语言--2go基础-->基本数据类型
开发语言·前端·后端·golang
爱吃泡芙的小白白17 小时前
Vue 3 核心原理与实战:从响应式到企业级应用
前端·javascript·vue.js
卓怡学长17 小时前
m115乐购游戏商城系统
java·前端·数据库·spring boot·spring·游戏
老陈聊架构18 小时前
『AI辅助Skill』掌握三大AI设计Skill:前端独立完成产品设计全流程
前端·人工智能·claude·skill
Ulyanov18 小时前
从桌面到云端:构建Web三维战场指挥系统
开发语言·前端·python·tkinter·pyvista·gui开发
cypking19 小时前
二、前端Java后端对比指南
java·开发语言·前端
糠帅傅蓝烧牛肉面19 小时前
单实例多MCP聚合服务:两种实现方案深度对比
前端·docker·ai
JosieBook19 小时前
【Vue】12 Vue技术—— Vue 事件修饰符详解:掌握事件处理的高级技巧
前端·javascript·vue.js