vue3封装ECharts组件详解

yizhihongxing

Vue3封装ECharts组件详解

前言

ECharts是一个非常流行的可视化图表库,它提供了丰富的图表类型和灵活的配置选项,满足了各种数据展示的需求。本文主要介绍如何在Vue3中封装ECharts组件。

准备工作

在使用ECharts之前,需要先安装echarts库。

npm install echarts@^5.1.0

我们还需要安装@vueuse/core库来使用useDebouncedFn方法,防抖函数的使用可以在图表动态交互时提高性能。

npm install @vueuse/core@^5.0.0

封装ECharts组件

我们先把需要的echarts实例引入。

import * as echarts from 'echarts';

为了便于组件复用,我们定义一个基础的ECharts组件,命名为BaseEChart。该组件提供基础的ECharts实例创建和销毁方法,以及重置图表方法。

<template>
  <div class="chart-container" ref="chartRef"></div>
</template>

<script>
import * as echarts from 'echarts';
import { defineComponent } from 'vue';

export default defineComponent({
  props: {
    options: {
      type: Object,
      required: true,
    },
    width: {
      type: [Number, String],
      default: '100%',
    },
    height: {
      type: [Number, String],
      default: '400',
    },
  },
  data() {
    return {
      chart: null,
      chartResizeFn: null,
    };
  },
  computed: {
    chartStyle() {
      return {
        width: typeof this.width === 'string' ? this.width : this.width + 'px',
        height: typeof this.height === 'string' ? this.height : this.height + 'px',
      };
    },
  },
  mounted() {
    this.createChart();
    this.chartResizeFn = this.$utils.useDebouncedFn(() => {
    this.chart?.resize();
    });
    window.addEventListener('resize', this.chartResizeFn);
  },
  updated() {
    this.chart.clear();
    this.chart.setOption(this.options);
  },
  beforeUnmount() {
    if (this.chart) {
      window.removeEventListener('resize', this.chartResizeFn);
      this.chart.dispose();
      this.chart = null;
      this.chartResizeFn = null;
    }
  },
  methods: {
    createChart() {
      this.chart = echarts.init(this.$refs.chartRef);
      this.chart.setOption(this.options);
    },
    resetChart() {
      this.chart.clear();
      this.chart.setOption(this.options);
    },
  },
});
</script>

<style scoped>
.chart-container {
  margin: 0px;
}
</style>

在该基础组件中,我们定义了三个props:

  • options:echarts图表配置。该属性必传。
  • width:图表宽度,默认100%。
  • height:图表高度,默认400。

在mounted生命周期中,我们用echarts.init()方法传入组件的ref属性来创建echarts实例。通过setOption()方法传入options属性来配置图表。定义了一个防抖函数来处理浏览器窗口的resize事件,以达到图表的自适应大小触发的目标。

在updated生命周期中,我们在数据更新后,通过调用clear()方法和setOption()方法来更新图表。

在beforeUnmount生命周期中,我们先在window对象上取消resize事件,然后调用dispose()方法来销毁echarts实例。

使用封装的ECharts组件

我们以一个柱状图的实例来演示如何使用BaseEChart组件。

首先,我们在父组件中引入BaseEChart组件,定义一个名为BarChart的组件。在该组件中,我们引入定义好的BaseEChart组件来实现柱状图的封装。

<template>
  <div class="chart-block">
    <h3 class="chart-title">{{ title }}</h3>
    <base-echart
      :options="options"
      :width="width"
      :height="height"
    />
  </div>
</template>

<script>
import BaseEChart from '@/components/BaseEChart.vue';
import { defineComponent } from 'vue';

export default defineComponent({
  name: 'BarChart',
  components: {
    BaseEChart,
  },
  props: {
    data: {
      type: Array,
      required: true,
    },
    title: {
      type: String,
      default: '',
    },
    xAxisName: {
      type: String,
      default: '',
    },
    yAxisName: {
      type: String,
      default: '',
    },
    width: {
      type: [Number, String],
      default: '100%',
    },
    height: {
      type: [Number, String],
      default: '400',
    },
  },
  computed: {
    options() {
      return {
        xAxis: {
          type: 'category',
          data: this.data.map((item) => item.name),
          name: this.xAxisName,
        },
        yAxis: {
          type: 'value',
          name: this.yAxisName,
        },
        series: [
          {
            type: 'bar',
            data: this.data.map((item) => item.value),
          },
        ],
      };
    },
  },
});
</script>

<style scoped>
.chart-block {
  margin: 10px;
}
.chart-title {
  margin: 0 0 10px;
  font-size: 16px;
}
</style>

在该组件中,我们定义了六个props:

  • data:柱状图的数据。该属性必传。
  • title:柱状图的标题。默认为空。
  • xAxisName:x轴的名称。默认为空。
  • yAxisName:y轴的名称。默认为空。
  • width:图表宽度。默认100%。
  • height:图表高度。默认400。

在该组件中,我们重新定义了计算属性options,根据传递的data属性和其他属性来返回echarts图表的配置,比如图表类型、x轴、y轴、系列等。

定义完成后我们就可以在父组件中引入该柱状图组件,并传入相关参数,从而展示一个基础的柱状图。

<template>
  <div>
    <h2 class="page-title">柱状图1</h2>
    <bar-chart
      :data="data"
      title="柱状图示例"
      xAxisName="X轴"
      yAxisName="Y轴"
    />
  </div>
</template>

<script>
import BarChart from '@/components/BarChart.vue';
import { defineComponent } from 'vue';

export default defineComponent({
  name: 'SamplePage',
  components: {
    BarChart,
  },
  data() {
    return {
      data: [
        {name: '测试1', value: 10},
        {name: '测试2', value: 20},
        {name: '测试3', value: 30},
        {name: '测试4', value: 40},
        {name: '测试5', value: 50},
      ],
    };
  },
});
</script>

在这个示例中,我们引入刚才定义的柱状图组件,并传入了必需的data属性,以及可选的标题和轴名称等属性,以实现基础的柱状图展示。

结语

通过以上步骤,我们已经成功的封装了一个基础的ECharts组件,并且实现了一个柱状图的示例。在实际项目中,我们可以定义不同样式的图表组件,来满足各种数据可视化展示的需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue3封装ECharts组件详解 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • javascript图片延迟加载实现方法及思路

    下面我来详细讲解一下“javascript图片延迟加载实现方法及思路”的完整攻略。 什么是图片延迟加载 图片延迟加载(Lazy Load)是一种优化网页性能的技术,它可以延迟加载页面中的图片,使网页的加载速度更快,提升用户的体验。具体实现就是在网页中,把页面中的图片的真实地址存储在其他属性里,待页面加载完毕后,再通过 JavaScript 代码来获取并替换图…

    other 2023年6月25日
    00
  • 我的世界服务器开启设置全攻略 我的世界开服图文详细教程

    我的世界服务器开启设置全攻略 前言 想要在我的世界游戏中开启自己的服务器,让更多玩家一起来游戏,那么本文将为大家提供完整的开服教程,让您轻松了解如何开启自己的服务器。 准备 在开始之前,需要做以下准备工作:1. 一台可以运行Minecraft服务器的电脑或者租用一台云服务器。2. 从官网下载Minecraft服务器程序。3. 前往你的路由器里面设置端口转发规…

    other 2023年6月27日
    00
  • FeatureCAM2018怎么安装?FeatureCAM安装详细图解(附下载地址)

    FeatureCAM 2018安装攻略 FeatureCAM是一款功能强大的计算机辅助制造(CAM)软件,用于自动化生成机械零件的加工程序。下面是FeatureCAM 2018的安装攻略,包括详细的步骤和示例说明。 步骤一:下载FeatureCAM 2018 首先,你需要下载FeatureCAM 2018的安装文件。你可以在官方网站或其他可信的软件下载网站上…

    other 2023年8月4日
    00
  • 织梦dedecms安全漏洞include/common.inc.php漏洞解决方法

    织梦dedecms安全漏洞include/common.inc.php漏洞解决方法攻略 背景 织梦dedecms是一款常用的开源内容管理系统,但在其include/common.inc.php文件中存在一个安全漏洞,可能导致恶意用户执行任意代码。本攻略将详细讲解该漏洞的解决方法。 漏洞描述 在织梦dedecms的include/common.inc.php文…

    other 2023年7月29日
    00
  • 怎么看别人ip qq邮件查看别人的IP地址方法

    怎么看别人IP的方法 如果你想查看别人的IP地址,可以使用以下几种方法: 1. QQ聊天记录查看IP地址 如果你有对方的QQ号码,并且和对方有过聊天记录,你可以通过QQ聊天记录来查看对方的IP地址。下面是具体的步骤: 打开QQ软件并登录你的账号。 打开与对方的聊天记录。 在聊天记录中找到对方发送的消息。 将鼠标悬停在对方发送的消息上,等待几秒钟。 一个小窗口…

    other 2023年7月31日
    00
  • 如何使用“purge 命令”清理 Mac OS X 内存空间

    如何使用 purge 命令清理 Mac OS X 内存空间 在 Mac OS X 上,purge 命令可以用于清理内存空间,以提高系统的性能和响应速度。purge 命令会强制系统将内存中的缓存数据写入磁盘,并释放已使用的内存。下面是使用 purge 命令清理 Mac OS X 内存空间的完整攻略。 步骤 1:打开终端 首先,打开终端应用程序。您可以在“应用程…

    other 2023年7月31日
    00
  • openwrt通过iso安装

    当然,我可以为您提供有关“OpenWrt通过ISO安装”的完整攻略,以下是详细说明: 什么是OpenWrt? OpenWrt是一个基于Linux的嵌入式操作系统,主要用于路由器等网络设备。OpenWrt提供了丰富的软件包管理系统,方便地安装和管理各种网络应用程序。 OpenWrt通过ISO安装 OpenWrt可以通过ISO镜像进行安装。以下是详细步骤: 下载…

    other 2023年5月7日
    00
  • JSON 数字排序多字段排序介绍

    JSON 数字排序多字段排序介绍 简介 JSON是一种基于键值对的轻量级数据交换格式,常用于前后端数据传输。在实际应用中,我们经常需要对JSON数据进行排序,例如对用户信息按照年龄和姓名进行排序,这时就需要使用多字段排序。 数字排序 升序和降序 对于仅包含数字的JSON数据,我们可以使用JavaScript内置的sort()方法进行排序。sort()的默认顺…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部