使用 ECharts 與 Vue 構建數據可視化組件

在前端開發中,數據可視化是非常重要的一部分。ECharts 作為一個功能強大且易于使用的開源數據可視化庫,被廣泛應用于各種圖表展示需求中。而 Vue.js 是當下流行的前端框架之一,它的數據驅動和組件化開發模式讓我們能輕松地將 ECharts 集成到 Vue 組件中。本篇博客將通過一個實際的代碼示例,逐步解析如何將 ECharts 與 Vue 結合使用,構建可復用的數據可視化組件。

1. Vue 模板部分
<template><div ref="chart" id="chart-container" style="width: 100%; height: 400px;"></div>
</template>

在 Vue 組件的模板部分,我們定義了一個 div,它將作為 ECharts 的容器。ref="chart" 是 Vue 中的一個引用,用于在 JavaScript 中獲取這個 DOM 元素,style 用于設置圖表的寬高。

2. 腳本部分 - Props 定義
props: {source: {type: [Array, Object],required: true},tooltip: {type: Array,default: () => []},xName: {type: String,default: ''},yName: {type: String,default: ''},singleSelect: {type: Boolean,default: false},type: {type: String,required: true},RequestParameters: {type: Object,default: () => ({})}
},

props 是 Vue 組件用于接收父組件傳遞數據的屬性。在這里我們定義了多個屬性:

  • source: 必填,表示圖表的數據源,可以是數組或對象。
  • tooltip: 用于顯示自定義的提示信息,默認為空數組。
  • xNameyName: 分別為 X 軸和 Y 軸的名稱。
  • singleSelect: 布爾值,控制圖例是否為單選。
  • type: 圖表的類型,如線圖、柱狀圖等。
  • RequestParameters: 請求參數,用于一些特定的業務需求,默認為空對象。
3. datamounted 鉤子
data() {return {chartInstance: null,};
},
mounted() {this.initChart(); // 初始化圖表window.addEventListener('resize', this.handleResize); // 監聽窗口大小變化
},
beforeDestroy() {window.removeEventListener('resize', this.handleResize);if (this.chartInstance) {this.chartInstance.dispose(); // 銷毀圖表實例}
}
  • data: Vue 組件的局部數據。在這里,我們定義了 chartInstance,用于存儲 ECharts 實例。
  • mounted: Vue 的生命周期鉤子函數,當組件掛載到 DOM 后會觸發。我們在這里初始化圖表并監聽窗口大小變化,以便圖表在窗口尺寸變化時能夠自適應。
  • beforeDestroy: 在組件銷毀前,我們移除窗口的 resize 事件監聽器,并銷毀 ECharts 實例,避免內存泄漏。
4. 圖表的初始化和更新
methods: {handleResize() {if (this.chartInstance) {this.chartInstance.resize(); // 調用圖表實例的 resize 方法}},initChart() {const chartDom = this.$refs.chart; // 通過 ref 獲取 DOMif (chartDom) {this.chartInstance = echarts.init(chartDom); // 初始化 ECharts 實例this.updateChart(); // 更新圖表} else {console.error("圖表容器未找到");}},updateChart() {let option = {};switch (this.type) {case 'timeLine':option = this.getTimeLineDataTicks();break;// 省略其他 casedefault:console.warn(`不支持的圖表類型: ${this.type}`);}if (option && this.chartInstance) {this.chartInstance.setOption(option); // 設置圖表配置項}},
}
  • handleResize: 當窗口大小變化時,調用圖表實例的 resize 方法讓圖表自適應。
  • initChart: 使用 this.$refs.chart 獲取 DOM 元素,調用 echarts.init 方法來初始化 ECharts 實例。
  • updateChart: 根據 type 判斷要渲染的圖表類型,并調用對應的生成圖表配置的方法,如 getTimeLineDataTicks。然后將生成的配置傳入 chartInstance.setOption 方法,完成圖表的渲染。
5. 圖表配置的生成

接下來,我們來看一個具體的圖表配置生成函數:

getTimeLineDataTicks() {const { source, xName, yName, singleSelect } = this;const xAxis = [];const legend = [];const series = [];this.source.forEach(item => {const date = new Date(item.name);item.name = date.toLocaleString(); if (!xAxis.includes(item.name)) xAxis.push(item.name);if (!legend.includes(item.group)) legend.push(item.group);});legend.forEach(group => {const seriesData = source.filter(item => item.group === group).map(item => item.value);series.push({name: group,type: 'line',data: seriesData,connectNulls: true,showSymbol: true,label: {show: true,position: 'top',formatter: '{c}',},});});return {tooltip: {trigger: 'axis',formatter(params) {let tooltip = `${xName} : ${params[0].name}<br/>`;params.forEach(param => {tooltip += `<span style="background-color:${param.color};"></span>`;tooltip += `${param.seriesName} : ${param.value}<br/>`;});return tooltip;}},legend: {data: legend,selectedMode: singleSelect ? 'single' : 'multiple',},xAxis: {type: 'category',name: xName,data: xAxis,boundaryGap: false,},yAxis: {type: 'value',name: yName,},series: series,};
}
  • getTimeLineDataTicks: 這個方法生成時間軸折線圖的配置項。

    • 首先從 source 中提取 X 軸數據(xAxis)、圖例數據(legend)和每個系列(series)的數據點。
    • 使用 ECharts 的配置格式,定義圖表的 tooltiplegendxAxisyAxis,最后返回整個圖表的配置對象。
  • tooltip: 鼠標懸停時顯示的提示框,通過 formatter 方法自定義提示信息。

  • legend: 圖例部分,用戶可以根據圖例顯示或隱藏某些系列的數據。

  • xAxisyAxis: 定義 X 軸和 Y 軸的樣式與數據。

  • series: 定義圖表中的每個系列數據,這里是折線圖。

6. 樣式部分
<style scoped>
.chart {width: 100%;height: 400px;
}
</style>
  • 樣式部分很簡單,我們為 chart 容器設置了寬度和高度。
7. 完整的工作流程
  1. 組件被掛載到 DOM 上后,mounted 鉤子被觸發,調用 initChart 方法。
  2. initChart 方法中,通過 this.$refs.chart 獲取圖表的 DOM 容器,并使用 echarts.init 初始化 ECharts 實例。
  3. 根據傳入的 type,在 updateChart 方法中調用不同的圖表配置生成方法(如 getTimeLineDataTicks)。
  4. 生成的配置通過 chartInstance.setOption 方法應用到圖表上,最終完成圖表的渲染。
  5. 當窗口大小發生變化時,handleResize 會自動調整圖表的尺寸。

總結

通過 Vue 和 ECharts 的結合,我們可以輕松實現一個高度可復用的圖表組件。組件化的設計讓我們可以將不同類型的圖表封裝在一起,并且根據傳入的 type 動態渲染出不同的圖表。無論是折線圖、柱狀圖還是復雜的樹狀圖,都能通過 ECharts 強大的圖表配置系統輕松實現。

希望這篇博客能夠幫助你更好地理解如何在 Vue 項目中集成 ECharts,并且為你今后的數據可視化項目提供一些思路和參考。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64551.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64551.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64551.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RPA系列-uipath 學習筆記4

使用Uipath 處理hover的問題 備注&#xff1a;使用uipath stversion&#xff1a;2024.10.6,所有學習來源自uipath Academy 首先&#xff0c;打開uipath給我們提供的一個網站 ACME,這個網站呢&#xff0c;需要提前注冊一下的哈。 今天呢&#xff0c;就是記錄一下&#xff0c;怎…

Linux:進程概念

1.馮諾依曼體系結構 結論&#xff1a; --- CPU不和外設直接打交道&#xff0c;和內存直接打交道。 --- 所有的外設&#xff0c;有數據需要收入&#xff0c;只能載入到內存中&#xff1b;內存寫出&#xff0c;也一定是寫道外設中。 --- 為什么程序要運行必須加載到內存&#xf…

活動預告 | Microsoft Azure 在線技術公開課:使用 Azure OpenAI 服務構建生成式應用

課程介紹 通過 Microsoft Learn 免費參加 Microsoft Azure 在線技術公開課&#xff0c;掌握創造新機遇所需的技能&#xff0c;加快對 Microsoft Cloud 技術的了解。參加我們舉辦的“使用 Azure OpenAI 服務構建生成式應用”活動&#xff0c;了解如何使用包括 GPT 在內的強大的…

Linux(Centos 7.6)常見基礎配置

1.網絡配置 網絡配置詳見&#xff1a;VMware安裝Linux(Centos 7.6)后網絡配置 2.yum源配置 yum源配置詳見&#xff1a;Linux(Centos 7.6)yum源配置 3.主機名配置 1.Linux(Centos 7.6)系統安裝后&#xff0c;沒有配置主機名時&#xff0c;root用戶登錄后&#xff0c;是如下…

【PyCharm】如何把本地整個項目同步到服務器?

在PyCharm中&#xff0c;您可以使用部署功能將項目同步到服務器。以下是步驟和示例配置&#xff1a; 打開PyCharm&#xff0c;選擇您的項目。 點擊菜單欄的 “File” -> “Settings” -> “Build, Execution, Deployment”。 在左側菜單中&#xff0c;選擇 “Deployme…

電子電器架構 ---什么是智能電動汽車上的逆變器?

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 所謂雞湯,要么蠱惑你認命,要么慫恿你拼命,但都是回避問題的根源,以現象替代邏輯,以情緒代替思考,把消極接受現實的懦弱,偽裝成樂觀面對不幸的…

Flutter:打包apk,詳細圖文介紹

困擾了一天&#xff0c;終于能正常打包apk安裝了&#xff0c;記錄下打包的流程。建議參考我這篇文章時&#xff0c;同時看下官網的構建說明。 官網構建并發布 Android 應用詳情 1、AS創建Flutter項目 2、cmd執行命令 生成一個sunluyi.jks的文件&#xff0c;可以自行把sunluyi替…

【服務器學習專欄 1.2 -- 帶外管理】

請閱讀 嵌入式學習必備專欄 文章目錄 Overview服務器帶外管理BMC 介紹BMC 特點BMC 工作原理 Overview 從技術的角度&#xff0c;網絡管理可分為帶外管理&#xff08;out-of-band&#xff09;和帶內管理&#xff08;in-band&#xff09;兩種管理模式。 帶內管理&#xff0c;是指…

南京市建鄴區南苑街道一行蒞臨園區考察交流

2024年8月28日&#xff0c;南京市建鄴區南苑街道辦事處副主任董兵、南苑街道發展服務辦公室一級主任科員王洪政、建鄴區國資集團科創公司經理杲暢&#xff0c;在樹莓集團華東區負責人田林和陳強經理的陪同下&#xff0c;蒞臨集團總部-國際數字影像產業園考察交流。 樹莓科技&am…

docker中使用nginx

宿主機和docker中nginx做映射 宿主機中nginx 映射目錄 /root/myDockerData/devnginx 在容器中相關位置分別是&#xff1a; 配置文件位置&#xff1a;/etc/nginx/ 日志位置&#xff1a;/var/log/nginx/ 項目位置&#xff1a;/usr/share/nginx/html 如下配置啟動命令行&#x…

【ES6復習筆記】對象方法擴展(17)

對象方法擴展 在 JavaScript 中&#xff0c;對象是屬性和方法的集合。除了內置的方法&#xff0c;我們還可以通過擴展對象的原型來添加新的方法。本教程將介紹如何使用 Object.is、Object.assign 和 Object.setPrototypeOf 方法來擴展對象。 1. Object.is 判斷兩個值是否完全…

基于JDK 17 編寫的Java常用工具類

文章目錄 DateUtilsEncryptUtilsFunIdCardCalibrationUtilResultResultCodeValidateNameUtilValidatePhoneUtil 廢話少說看源碼 DateUtils package com.huihang.core.utils;import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import j…

Casino Royale靶場wp

0x00 下載安裝 https://download.vulnhub.com/casinoroyale/CasinoRoyale.ova 導入vmware啟動 0x01 主機信息收集 0x02目錄掃描 index.php 獲取到一個域名 修改本地hosts 添加一行 路徑&#xff1a;C:\Windows\System32\drivers\etc 192.168.2.20 casino-royale.local 點擊…

智能家居體驗大變革 博聯 AI 方案讓智能不再繁瑣

1. 全球AI技術發展背景及智能家居市場趨勢 人工智能&#xff08;AI&#xff09;技術的飛速發展正在推動全球各行業的數字化轉型。國際電信聯盟與德勤聯合發布《人工智能向善影響》報告指出&#xff0c;全球94%的商界領袖認為&#xff0c;人工智能技術對于其企業在未來5年內的發…

鴻蒙開發(27)案例今日任務

案例為純前端實現&#xff0c;總結案例。 主頁面代碼 import { TaskStatisties } from ../view/TaskStatisties import { TaskItem } from ../view/TaskItem import CreateTaskModel, {TaskModel} from ../viewmodel/TaskModel import { router } from kit.ArkUI// xxx.ets En…

WPF編程excel表格操作

WPF編程excel表格操作 摘要NPOI安裝封裝代碼測試代碼 摘要 Excel操作幾種方式 使用開源庫NPOI(常用&#xff0c;操作豐富)使用Microsoft.Office.Interop.Excel COM組件(兼容性問題)使用OpenXml(效率高)使用OleDb(過時) NPOI安裝 封裝代碼 using System; using System.IO; u…

tcp_rcv_synsent_state_process函數

tcp_rcv_synsent_state_process 是 Linux Kernel 中用于處理 TCP 連接在 SYN-SENT 狀態下接收到報文的函數。這個函數在 TCP 三次握手階段起到了至關重要的作用,處理了在客戶端發送 SYN 請求之后收到服務器響應報文的各種情況。 以下是這個函數的解讀和剖析: int tcp_rcv_sy…

音視頻采集推流時間戳記錄方案

音視頻同步更多文章 深入理解音視頻pts&#xff0c;dts&#xff0c;time_base以及時間數學公式_視頻pts計算-CSDN博客 ffplay音視頻同步分析_ffplay 音視頻同步-CSDN博客 音視頻采集打時間戳設計 實時音視頻數據的采集和處理場景。具體來說: 采集階段: 在音視頻數據采集過…

Spark Runtime Filter

Runtime Filter 參考鏈接&#xff1a; https://docs.google.com/document/d/16IEuyLeQlubQkH8YuVuXWKo2-grVIoDJqQpHZrE7q04/edit?tabt.0https://www.modb.pro/db/557718https://issues.apache.org/jira/browse/SPARK-32268https://github.com/apache/spark/pull/35789https…

從0入門自主空中機器人-1【課程介紹】

關于本課程&#xff1a; 本次課程是一套面向對自主空中機器人感興趣的學生、愛好者、相關從業人員的免費課程&#xff0c;包含了從硬件組裝、機載電腦環境設置、代碼部署、實機實驗等全套詳細流程&#xff0c;帶你從0開始&#xff0c;組裝屬于自己的自主無人機&#xff0c;并讓…