Vue项目中较优雅地封装Echarts

2023-05-16

场景

  • 1、Echarts[1]使用时,都需要写一堆的「option」,如果每个图表都要写一个,一个文件里面的代码量是很大的

  • 2、不方便复用

需求

  • 1、方便复用

  • 2、展示类的图表,数据与业务、样式分离,只传数据就行

  • 3、项目里需要用到的图表会有多个,实现少代码自动化导入,不需要一个个「import」

  • 4、本人图表用在大屏数据可视化的情况比较多,采用的是等比缩放的方式,所以图表也能根据界面缩放自动缩放,不需要手动调用

  • 5、图表可配置

代码总览

涉及的文件如下(具体参考「代码」):

|-- src
    |-- components
        |-- chart
            |-- index.vue    // 图表单文件组件,供界面调用
            |-- index.js    // 实现自动化导入options里的图表option
            |-- options    // 存放各种图表的option
                |-- bar    // 随便一例子
                    |-- index.js
    |-- views
        |-- chartTest    // 实例所在
            |-- index.vue
            |-- index.scss
            |-- index.js
|-- main.js    // 全局引入echarts图表

实现

components--chart--index.vue

这里定义了一个名为ChartView 的组件,开放了4个可配置的属性:宽度width,高度height, 是否自动调整大小autoResize(默认是), 图表的配置chartOption

这里默认用Canvas 渲染图表了,也可以用SVG的,自选吧

具体代码如下

<template>
  <div class="chart">
    <div ref="chart" :style="{ height: height, width: width }" />
  </div>
</template>
<script>

// 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
import * as echarts from 'echarts/core'
// 引入柱状图图表,图表后缀都为 Chart
import {
  BarChart
} from 'echarts/charts'
// 引入提示框,标题,直角坐标系组件,组件后缀都为 Component
import {
  TitleComponent,
  TooltipComponent,
  GridComponent
} from 'echarts/components'
// 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
import {
  CanvasRenderer
} from 'echarts/renderers'

// 注册必须的组件
echarts.use(
  [TitleComponent, TooltipComponent, GridComponent, BarChart, CanvasRenderer]
)

export default {
  name: 'ChartView',
  props: {
    width: {
      type: String,
      default: '100%'
    },
    height: {
      type: String,
      default: '350px'
    },
    autoResize: {
      type: Boolean,
      default: true
    },
    chartOption: {
      type: Object,
      required: true
    },
    type: {
      type: String,
      default: 'canvas'
    }
  },
  data() {
    return {
      chart: null
    }
  },
  watch: {
    chartOption: {
      deep: true,
      handler(newVal) {
        this.setOptions(newVal)
      }
    }
  },
  mounted() {
    this.initChart()
    if (this.autoResize) {
      window.addEventListener('resize', this.resizeHandler)
    }
  },
  beforeDestroy() {
    if (!this.chart) {
      return
    }
    if (this.autoResize) {
      window.removeEventListener('resize', this.resizeHandler)
    }
    this.chart.dispose()
    this.chart = null
  },
  methods: {
    resizeHandler() {
      this.chart.resize()
    },
    initChart() {
      this.chart = echarts.init(this.$refs.chart, '', {
        renderer: this.type
      })
      this.chart.setOption(this.chartOption)
      this.chart.on('click', this.handleClick)
    },
    handleClick(params) {
      this.$emit('click', params)
    },
    setOptions(option) {
      this.clearChart()
      this.resizeHandler()
      if (this.chart) {
        this.chart.setOption(option)
      }
    },
    refresh() {
      this.setOptions(this.chartOption)
    },
    clearChart() {
      this.chart && this.chart.clear()
    }
  }
}
</script>

components--chart--index.js

这里主要利用require.context,把options里面定义的图表遍历导入,这样就不需要在代码里一个个import了,特别是图表多的时候。

const modulesFiles = require.context('./options', true, /index.js$/)
let modules = {}
modulesFiles.keys().forEach(item => {
  modules = Object.assign({}, modules, modulesFiles(item).default)
})
export default modules

components--chart--options

这里展示下如何封装自己想要的图表

在Echarts官方示例[2]上随便选了个示例

Snip20210812_59.png

options下新建一个bar目录,bar目录下新建一个index.js文件。(个人习惯而已,喜欢每个图表都独立文件夹存放。不喜欢这种方式的,可以不放目录,直接js文件,但是components--chart--index.js要对应修改下)

直接复制示例的option代码

index.js具体代码如下

const testBar = (data) => {
  const defaultConfig = {
    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'
    }]
  }

  const opt = Object.assign({}, defaultConfig)
  return opt
}

export default {
  testBar
}

testBar方法是可以传参的,具体使用的时候,图表所需要配置的属性,如:data数据、图表颜色......等都可以作为参数传。

main.js

这里全局引入下封装的Echarts组件,方便界面调用。(至于单个引用的方式,就不必多说了)

具体代码如下:

import eChartFn from '@/components/chart/index.js'
import ChartPanel from '@/components/chart/index.vue'
Vue.component(ChartPanel.name, ChartPanel)
Vue.prototype.$eChartFn = eChartFn

chartTest

这里展示下如何调用封装的bar图表,主要代码如下

index.vue

<chart-view class="chart-content" :chart-option="chartOpt" :auto-resize="true" height="100%" />

index.js

export default {
  name: 'chartTestView',
  data() {
    return {
      chartOpt: {}
    }
  },
  mounted() {},
  created() {
    this.chartOpt = this.$eChartFn.testBar()
  },
  methods: {
  },
  watch: {}
}

效果如下

Snip20210812_60.png

可以尝试拖动浏览器的大小,可以看到,图表也是随着浏览器的拖动自动缩放的。

代码

代码总览的目录去代码里找着看就行了。

总结

Echarts用到的各种图表,基本上都可以在Echarts官方示例和Echarts可视化作品分享[5]上找到,特别是Echarts可视化作品分享,做项目的时候,可以去参考。

以上,封装了chart组件,按照上述方式,把图表的option配置和相关处理都放options文件夹下面,调用图表时传对应的option,也就几行代码的事情,算是比较方便了。

chart组件很方便复用的,直接就可以使用了。


关注公众号:【全栈星球】,免费领取前端、Node、计算机基础学科电子书籍

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue项目中较优雅地封装Echarts 的相关文章

随机推荐

  • USB 学习路线

    梳理了一下 USB 的学习路线图 xff0c 供大家参考 xff1a
  • keil5 SW 下载提示 internal command error

    博主手焊板子 xff0c 箭头处 10R 焊接成了 10K xff0c 导致 VDDA 和 VSSA 电压异常 xff0c 下载报错
  • Socket通信(TCP/IP)原理与eclipse实践

    网络上的两个程序通过一个双向的通信连接实现数据的交换 xff0c 这个连接的一端称为一个socket 建立网络通信连接至少要一对端口号 socket socket本质是编程接口 API xff0c 对TCP IP的封装 xff0c TCP
  • C++ WinSock2.h与ws2def.h重定义问题

    在用Visual Studio做开发时 xff0c 代码改动后编译出现大量莫名其妙的错误 xff0c 如下 xff1a 最终解决方法如下 xff1a 如果是win32使用VS原始IDE构建的程序 xff1a 在vs的项目属性设置中找到C C
  • 该主机 CPU 类型不支持虚拟化性能计数器,模块“VPMC”启动失败,未能启动虚拟机。

    该主机 CPU 类型不支持虚拟化性能计数器 模块 VPMC 启动失败 未能启动虚拟机 解决办法 xff1a 点击 虚拟机 设置 选择处理器 右边的三个框框全部去掉 xff0c 不要勾选 xff0c 再次启动虚拟机即可 如果是因为没有开启主机
  • 判断系统是大端还是小端

    文章目录 大端与小端判断大端 小端的三种方式直接观察变量的内存值强制转换 xff1a 将 amp int转换为char 使用联合体union进行判断 大端与小端 大端模式 xff1a 指数据的高字节保存在内存的低地址中 xff0c 低字节保
  • void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)的一些理解

    GPIO TypeDef GPIOA BASE 表示将GPIOA BASE强制转换为指针类型的结构体 xff0c define GPIOA GPIO TypeDef GPIOA BASE 表示用 GPIO TypeDef GPIOA BAS
  • OTT-TV网络电视EPG录制和EPG抓取解决方案

    EPG是Electrical Program Guide xff0c 也就是电子节目单 这个名词的出现和OTT TV或者说IPTV紧密相关 EPG功能是频道化电视以 频道 时间 方式提供一段时间内的所有电视节目信息 xff0c 实现业务浏览
  • ROS noetic 安装编译Cartographer踩坑记录

    ROS noetic 安装编译Cartographer踩坑记录 安装编译工具 span class token function sudo span span class token function apt get span update
  • 用PWM控制舵机(以是stm32为例)

    因为做校创需要用到舵机 xff0c 以前知道大致的理论 xff0c 因此看了一些帖子 xff0c 总结一下被以后查看 什么是PWM波 PWM就是脉冲宽度调制 xff0c 也就是占空比可变的脉冲波形 pwm的占空比 xff0c 就是指高电平保
  • 算法时间复杂度的计算

    一 算法时间复杂度定义 在进行算法分析时候 语句总的执行次数T n 是关于问题规模n的函数 进而分型T n 随着n的变化情况并确定T n 的数量级 算法的时间复杂度 也就是算法的时间度量记作 T n 61 O f n 它表示随着问题规模n的
  • 三角形最小路径和(JS)--自底向上解决(动态规划)

    题目描述 xff1a 给定一个三角形 xff0c 找出自顶向下的最小路径和 每一步只能移动到下一行中相邻的结点上 例如 xff0c 给定三角形 xff1a 2 3 4 6 5 7 4 1 8 3 自顶向下的最小路径和为 11 xff08 即
  • leetcode42--接雨水(JS)

    给定 n 个非负整数表示每个宽度为 1 的柱子的高度图 xff0c 计算按此排列的柱子 xff0c 下雨之后能接多少雨水 上面是由数组 0 1 0 2 1 0 1 3 2 1 2 1 表示的高度图 xff0c 在这种情况下 xff0c 可以
  • 自定义组件继承的组件基类React.Component是什么

    我们平时写React组件时都要继承一个父类 xff0c 那就是React Component 也会用到props state和setState xff0c 我们只是会使用它 xff0c 然而不知道它们怎么来的 xff0c 既要知其然也要知其
  • Java 在二维坐标系绘制矩形、圆形、多边形

    最近遇到一个需求 xff0c 大概要求是 xff1a 根据前端传递的参数 xff0c 在Java侧绘制虚拟的二维封闭图形 xff0c 判断各个图形间是否有交集 在java awt包下有个名为Shape的接口 xff0c 可以实现在二维坐标系
  • Uncaught (in promise) TypeError: Cannot read property 'data' of undefined

    最近在学习Redux的时 xff0c 自己写了个Demo xff0c 用fetch异步调用接口时返回这个脑壳疼的问题 问题 xff1a 问题排查 xff1a 一步一步在控制台打印 xff0c 并检测类型 xff0c 发现控制台打印undef
  • Ajax、fetch、axios的区别与优缺点

    背景 前端的技术发展速度非常的快 xff0c 异步请求也是其重要的体现之一 xff0c 从最早的原生XHR xff0c 再到JqueryAjax的统治时代 xff0c 再到近来 xff0c fetch axios等技术也开始出现并大量投入使
  • 什么是 Promise.allSettled() !新手老手都要会?

    什么是 Promise allSettled xff01 新手老手都要会 xff1f Promise allSettled 方法返回一个在所有给定的 promise 都已经 fulfilled 或 rejected 后的 promise x
  • 一份稳进Shopee的简历长啥样?

    小伙伴们好 xff0c 我是Eason 简历是求职流程的第一步 xff0c 是很关键的一环 Eason在做Shopee招聘工作时 xff0c 收到了投递的1000 43 的简历 xff0c 简历也修改过50多次 xff0c 最近也帮10多个
  • Vue项目中较优雅地封装Echarts

    场景 1 Echarts 1 使用时 xff0c 都需要写一堆的 option xff0c 如果每个图表都要写一个 xff0c 一个文件里面的代码量是很大的 2 不方便复用 需求 1 方便复用 2 展示类的图表 xff0c 数据与业务 样式