我不允许有人不会封装 ECharts

文章的开头总是很难水的,就不多说了

本文涉及:TypeScript、Vue3、 echarts

因为 ECharts 的使用场景及其广阔,并且定制化的场景比较多,所以就不封装可以复用的组件了,在我看来每个组件还是需要一个独立的 option ,这里仅封装更好使用的 echats

目录

|--src

    |--components    // 组件

        |--echarts    // echats 封装目录

            |--echarts-types.ts    // 一些类型

            |--library.ts          // 为 echats 增加的一些功能

            |--useECharts.ts      // 主函数


        |--EChartsComponents

            |--a-echarts.vue      // 组件使用


|--App.vue

代码

library.ts

在 library.ts 中集中引入,挂载 echarts 需要用到的组件和功能

import * as echarts from 'echarts/core';

import {

        BarChart,

        LineChart,

        PieChart,

        MapChart,

        PictorialBarChart,

        RadarChart,

        ScatterChart

} from 'echarts/charts';

import {

        TitleComponent,

        TooltipComponent,

        GridComponent,

        PolarComponent,

        AriaComponent,

        ParallelComponent,

        LegendComponent,

        RadarComponent,

        ToolboxComponent,

        DataZoomComponent,

        VisualMapComponent,

        TimelineComponent,

        CalendarComponent,

        GraphicComponent

} from 'echarts/components';

echarts.use([

        LegendComponent,

        TitleComponent,

        TooltipComponent,

        GridComponent,

        PolarComponent,

        AriaComponent,

        ParallelComponent,

        BarChart,

        LineChart,

        PieChart,

        MapChart,

        RadarChart,

        PictorialBarChart,

        RadarComponent,

        ToolboxComponent,

        DataZoomComponent,

        VisualMapComponent,

        TimelineComponent,

        CalendarComponent,

        GraphicComponent,

        ScatterChart

]);

export default echarts;

echarts-types.ts

一些需要使用的类型,在这里规范

export enum RenderType {

        SVGRenderer = 'SVGRenderer',

        CanvasRenderer = 'SVGRenderer'

}

export enum ThemeType {

        Light = 'light',

        Default = 'default',

}

useECharts.ts 主要文件

引入需要使用的功能模块,EChartsOption 类型在使用时容易报红,这里暂时用 any

import { onMounted, onUnmounted, Ref, unref } from "vue";

import echarts from "./library";

// import type { EChartsOption } from 'echarts'

import { SVGRenderer, CanvasRenderer } from 'echarts/renderers'

import { RenderType, ThemeType } from './echarts-types'

export function useECharts(elparams: Ref<HTMLDivElement> | HTMLDivElement, autoUpdateSize: boolean = false, render: RenderType = RenderType.SVGRenderer, theme = ThemeType.Default) {

        // 渲染模式

        echarts.use(render === RenderType.SVGRenderer ? SVGRenderer : CanvasRenderer)

        // echats实例

        let echartsInstance: echarts.ECharts | null = null

        // 初始化 echats实例

        function initCharts() {

                const el = unref(elparams)

                if (!el) return

                echartsInstance = echarts.init(el, theme)

        }

        // 配置

        function setOption(option: any) {

                showLoading()

                if (!echartsInstance) initCharts()

                if (!echartsInstance) return

                echartsInstance.setOption(option)

                hideLoading()

        }

        // 获取 echats实例

        function getInstance() {

                if (!echartsInstance) initCharts()

                return echartsInstance

        }

        // 更新大小

        function onResize() {

                echartsInstance?.resize()

        }

        // 监听元素大小变化

        function watchEl() {

                if (animation) unref(elparams).style.transition = 'width 1s, height 1s'

                const resizeObserve = new ResizeObserver(() => onResize())

                resizeObserve.observe(unref(elparams))

        }

        // 显示加载状态

        function showLoading() {

                if (!echartsInstance) initCharts()

                echartsInstance?.showLoading()

        }

        // 隐藏加载状态

        function hideLoading() {

                if (!echartsInstance) initCharts()

                echartsInstance?.hideLoading()

        }

        // 生命钩子——组件挂载完成

        onMounted(() => {

                window.addEventListener('resize', onResize)

                if (autoUpdateSize) watchEl()

        })

        // 生命钩子——页面销毁

        onUnmounted(() => {

                window.removeEventListener('resize', onResize)

        })

        return { setOptions, getInstance }

}

在组件中的使用

a-echarts.vue 使用,我们现在只需要去找一些 option 就可以实现不同的图表了

这个还不错的网站,有很多示例 PPChart 我们随便拿一个来试试吧,


把配置代码复制到下面,就可以看见效果了

<template>

        <div class="chart" ref="MyEcharts"></div>

</template>

<script lang="ts" setup>

import { onMounted, Ref, ref } from "vue";

import echarts from "../echarts/library";

//获取echarts实例

const MyEcharts = ref<HTMLDivElement | null>(null)

const { setOption, getInstance } = useECharts(MyEcharts as Ref<HTMLDivElement>, false, true)

onMounted(() => {


        setOption(option);

        const echartsInstance = getInstance()

})

</script>


App.vue

<template>

  <echarts></echarts>

</template>

<script setup lang="ts">

import echarts from './components/EchartsComponents/a-echarts.vue'

</script>

<style scoped></style>


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容