亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

在Vue3中如何更優(yōu)雅的使用echart圖表詳解

 更新時間:2022年05月23日 09:04:43   作者:_island  
ECharts是一個強大的畫圖插件,在vue項目中,我們常??梢砸肊charts來完成完成一些圖表的操作,下面這篇文章主要給大家介紹了關于在Vue3中如何更優(yōu)雅的使用echart圖表的相關資料,需要的朋友可以參考下

前言

在大屏可視化項目中,我們常常需要用到很多的圖表組件,通常你會編寫很多的option對圖表進行渲染,以及引入它們所需的一些組件并使用echart.use。

在Vue2中我們常常把可復用的組件單獨抽離出來,再通過props、emit等方法向復用組件中傳入組件所需數(shù)據(jù),而在Vue3中我們可以將一些邏輯功能寫成hook進行抽離和復用再傳入到視圖中,這會不僅讓你的組件中的代碼更加優(yōu)雅而且閱讀性更強。

封裝思路

引入模塊

我們先創(chuàng)建lib.ts文件,用于將echart圖表中所需要用到組件全部引入進來并導出。

由于引入的模塊過多,所以我們把它引入的模塊的代碼抽離出來,增加代碼的可閱讀性

// lib.ts
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;

封裝功能

在同級目錄下創(chuàng)建一個useChart.ts文件,這是我們復用echart圖表hook文件。

封裝功能如下:

  • 監(jiān)聽圖表元素變化及視圖,自動重新渲染圖表適應高度
  • 可傳入主題、渲染模式(SVG、Canvas)
  • loading效果
import { nextTick, onMounted, onUnmounted, Ref, unref } from "vue";
import type { EChartsOption } from 'echarts';
import echarts from "./lib";
import { SVGRenderer, CanvasRenderer } from "echarts/renderers";
import { RenderType, ThemeType } from "./types";

export default function useChart(elRef: Ref<HTMLDivElement>, autoChartSize = false, animation: boolean = false, render: RenderType = RenderType.SVGRenderer, theme: ThemeType = ThemeType.Default) {
    // 渲染模式
    echarts.use(render === RenderType.SVGRenderer ? SVGRenderer : CanvasRenderer)
    // echart實例
    let chartInstance: echarts.ECharts | null = null;

    // 初始化echart
    const initCharts = () => {
        const el = unref(elRef)
        if (!el || !unref(el)) {
            return
        }
        chartInstance = echarts.init(el, theme);
    }

    // 更新/設置配置
    const setOption = (option: EChartsOption) => {
        nextTick(() => {
            if (!chartInstance) {
                initCharts();
                if (!chartInstance) return;
            }

            chartInstance.setOption(option)
            hideLoading()
        })

    }

    // 獲取echart實例
    function getInstance(): echarts.ECharts | null {
        if (!chartInstance) {
            initCharts();
        }
        return chartInstance;
    }

    // 更新大小
    function resize() {
        chartInstance?.resize();
    }

    // 監(jiān)聽元素大小
    function watchEl() {
        // 給元素添加過渡
        if (animation) { elRef.value.style.transition = 'width 1s, height 1s' }
        const resizeObserver = new ResizeObserver((entries => resize()))
        resizeObserver.observe(elRef.value);
    }

    // 顯示加載狀
    function showLoading() {
        if (!chartInstance) {
            initCharts();
        }
        chartInstance?.showLoading()
    }
    // 顯示加載狀
    function hideLoading() {
        if (!chartInstance) {
            initCharts();
        }
        chartInstance?.hideLoading()
    }

    onMounted(() => {
        window.addEventListener('resize', resize)
        if (autoChartSize) watchEl();
    })

    onUnmounted(() => {
        window.removeEventListener('resize', resize)
    })

    return {
        setOption,
        getInstance,
        showLoading,
        hideLoading
    }
}
// types.ts
export enum RenderType {
    SVGRenderer = 'SVGRenderer',
    CanvasRenderer = 'SVGRenderer'
}
export enum ThemeType {
    Light = 'light',
    Dark = 'dark',
    Default = 'default'
}

有了以上封裝好之后的代碼,我們在組件中使用echart圖表庫時將會更加簡單而高效。

使用例子

// index.vue
<template>
    <div ref="chartEl" :style="{ width: `300px`, height: `300px` }"></div>
</template>

<script setup lang="ts">
import { onMounted, Ref, ref, computed, nextTick } from "vue";
import type { EChartsOption } from 'echarts'
import useChart, { RenderType, ThemeType } from '../../useChart'
import axios from 'axios'

const option = computed<EChartsOption>(() => ({
   // ...chart option
}))

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

const {
    setOption,
    showLoading
} = useChart(chartEl as Ref<HTMLDivElement>, true, true, RenderType.SVGRenderer, ThemeType.Dark)

onMounted(() => {
    nextTick(() => {
    	// 顯示loading
        showLoading()
        // 假裝有網(wǎng)絡請求 ...
        // 渲染圖表
        setOption(option.value);
    })
})
</script>

Github倉庫地址(含例子):github.com/QC2168/useC…

總結(jié)

到此這篇關于在Vue3中如何更優(yōu)雅的使用echart圖表的文章就介紹到這了,更多相關Vue3使用echart圖表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Vue Element UI + OSS實現(xiàn)上傳文件功能

    Vue Element UI + OSS實現(xiàn)上傳文件功能

    這篇文章主要為大家詳細介紹了Vue Element UI + OSS實現(xiàn)上傳文件功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • vue中的.$mount(''#app'')手動掛載操作

    vue中的.$mount(''#app'')手動掛載操作

    這篇文章主要介紹了vue中.$mount('#app')手動掛載操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • vue使用Office?Web實現(xiàn)線上文件預覽

    vue使用Office?Web實現(xiàn)線上文件預覽

    這篇文章主要為大家介紹了vue使用微軟的開發(fā)接口Office?Web,實現(xiàn)線上文件預覽,預覽word,excel,pptx,pdf文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Vite?Vue3?EsLint?Prettier配置步驟極簡方法詳解

    Vite?Vue3?EsLint?Prettier配置步驟極簡方法詳解

    這篇文章主要為大家介紹了Vite?Vue3?EsLint?Prettier配置步驟的極簡方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • 解決vue-cli單頁面手機應用input點擊手機端虛擬鍵盤彈出蓋住input問題

    解決vue-cli單頁面手機應用input點擊手機端虛擬鍵盤彈出蓋住input問題

    今天小編就為大家分享一篇解決vue-cli單頁面手機應用input點擊手機端虛擬鍵盤彈出蓋住input問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • vue devtools的安裝與使用教程

    vue devtools的安裝與使用教程

    vue-devtools是一款基于chrome游覽器的插件,用于調(diào)試vue應用,這可以極大地提高我們的調(diào)試效率,這篇文章主要介紹了vue devtools的安裝與使用教程,需要的朋友可以參考下
    2018-08-08
  • Vue如何清空對象

    Vue如何清空對象

    這篇文章主要介紹了Vue如何清空對象,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • VUE實現(xiàn)一個Flappy Bird游戲的示例代碼

    VUE實現(xiàn)一個Flappy Bird游戲的示例代碼

    這篇文章主要介紹了VUE實現(xiàn)一個Flappy Bird的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • Vue打包程序部署到Nginx 點擊跳轉(zhuǎn)404問題

    Vue打包程序部署到Nginx 點擊跳轉(zhuǎn)404問題

    這篇文章主要介紹了Vue打包程序部署到Nginx 點擊跳轉(zhuǎn)404問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • vue項目中data數(shù)據(jù)之間互相訪問的實現(xiàn)

    vue項目中data數(shù)據(jù)之間互相訪問的實現(xiàn)

    本文主要介紹了vue項目中data數(shù)據(jù)之間互相訪問的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05

最新評論