vue3+ts打開echarts的正確方式

来源:https://www.cnblogs.com/weizwz/archive/2023/12/28/17933635.html
-Advertisement-
Play Games

實例項目使用 vite5 + vue3 + ts,項目地址 vite-vue3-charts,預覽地址 https://weizwz.com/vite-vue3-charts 準備工作 1. 註冊為百度地圖開發者 官網地址,然後在 應用管理 -> 我的應用 里,創建應用,創建好後複製 AK 2. 在 ...


實例項目使用 vite5 + vue3 + ts,項目地址 vite-vue3-charts,預覽地址 https://weizwz.com/vite-vue3-charts

準備工作

1. 註冊為百度地圖開發者

官網地址,然後在 應用管理 -> 我的應用 里,創建應用,創建好後複製 AK
image

2. 在根目錄的 index.html 里引入百度地圖

<head>
  <meta charset="UTF-8" />
  <link rel="icon" type="image/svg+xml" href="/vite.svg" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>xxx</title>
  <script type="text/javascript" src="https://api.map.baidu.com/api?v=3.0&ak=你複製好的AK"></script>
</head>

head 里引入,是為了提前載入進來

3. 安裝 echarts

npm i echarts -S

封裝

1. 增加ts對百度地圖的支持

修改 .eslintrc.cjs,加入對百度地圖的支持

module.exports = {
  // 其他省略
  globals: {
    BMap: true
  }
}

2. 全局註冊 echarts

修改 main.ts

// 引入 echarts
import * as echarts from 'echarts'
import themeJSON from '@/assets/weizwz.json'
echarts.registerTheme('weizwz', themeJSON)

const app = createApp(App)
// 全局掛載 echarts
app.config.globalProperties.$echarts = echarts

3. 封裝 echarts

src/components 下新建 chart 文件夾,併在其下新建 index.vue,封裝如下

<script setup lang="ts">
import { onMounted, getCurrentInstance, defineExpose, ref } from 'vue'

defineOptions({
  name: 'WChart'
})
// defineExpose 讓父組件可調用此方法
defineExpose({
  setData
})

// 組件傳參
const props = defineProps({
  width: {
    type: String, //參數類型
    default: '100%', //預設值
    required: false //是否必須傳遞
  },
  height: {
    type: String,
    default: '10rem',
    required: true
  },
  option: {
    type: Object,
    default: () => {
      return {}
    },
    required: true
  },
  // 初始化之前的工作,比如載入百度地圖相關數據
  initBefore: {
    type: Function,
    required: false
  },
  // 初始化之後的工作,比如添加百度地址控制項
  initAfter: {
    type: Function,
    required: false
  }
})

let chart: { setOption: (arg0: Record<string, any>) => void; resize: () => void }
const wchart = ref(null)

//聲明周期函數,自動執行初始化
onMounted(() => {
  init()
  // 監控視窗大小,自動適應界面
  window.addEventListener('resize', resize, false)
})

//初始化函數
function init() {
  // 基於準備好的dom,初始化echarts實例
  const dom = wchart.value
  // 通過 internalInstance.appContext.config.globalProperties 獲取全局屬性或方法
  let internalInstance = getCurrentInstance()
  let echarts = internalInstance?.appContext.config.globalProperties.$echarts

  chart = echarts.init(dom, 'weizwz')
  // 渲染圖表
  if (props.initBefore) {
    props.initBefore(chart).then((data: Record<string, any>) => {
      setData(data)
      if (props.initAfter) props.initAfter(chart)
    })
  } else {
    chart.setOption(props.option)
    if (props.initAfter) props.initAfter(chart)
  }
}

function resize() {
  chart.resize()
}
// 父組件可調用,設置動態數據
function setData(option: Record<string, any>) {
  chart.setOption(option)
}
</script>

<template>
  <div ref="wchart" :style="`width: ${props.width} ; height: ${props.height}`" />
</template>

<style lang="scss" scoped></style>

使用

1. 使用 echarts 普通圖表

示例:使用玫瑰環形圖

<script setup lang="ts">
import WChart from '@comp/chart/index.vue'

defineOptions({
  name: 'ChartLoop'
})
// 正常 echarts 參數
const option = {
  grid: {
    top: '20',
    left: '10',
    right: '10',
    bottom: '20',
    containLabel: true
  },
  series: [
    {
      name: '人口統計',
      type: 'pie',
      radius: [50, 120],
      center: ['50%', '50%'],
      roseType: 'area',
      itemStyle: {
        borderRadius: 8
      },
      label: {
        formatter: '{b}\n{c} 萬人'
      },
      data: [
        { value: 2189.31, name: '北京' },
        { value: 1299.59, name: '西安' },
        { value: 1004.79, name: '長沙' }
      ]
    }
  ]
}
</script>

<template>
  <WChart width="100%" height="300px" :option="option" />
</template>

<style lang="scss" scoped></style>

image

2. 結合百度地圖

示例:西安熱力圖

<script setup lang="ts">
import { reactive } from 'vue'
import WChart from '@comp/chart/index.vue'
// 註意需要引入 bmap,即 echarts 對百度地圖的支持擴展
import 'echarts/extension/bmap/bmap'
// 熱力數據,內容如:{ features: [ { geometry: { coordinates: [ [ [x, y] ] ] } } ]}
// 為什麼這麼複雜,因為是我從阿裡地理數據下載的,地址 https://datav.aliyun.com/portal/school/atlas/area_selector
import xianJson from '@/assets/xian.json'

defineOptions({
  name: 'ChartMap'
})

const option = {
  animation: false,
  backgroundColor: 'transparent',
  bmap: {
    // 地圖中心點
    center: [108.93957150268, 34.21690396762],
    zoom: 12,
    roam: true
  },
  visualMap: {
    show: false,
    top: 'top',
    min: 0,
    max: 5,
    seriesIndex: 0,
    calculable: true,
    inRange: {
      color: ['blue', 'blue', 'green', 'yellow', 'red']
    }
  },
  series: [
    {
      type: 'heatmap',
      coordinateSystem: 'bmap',
      data: reactive([] as any[]),
      pointSize: 5,
      blurSize: 6
    }
  ]
}

const initBefore = () => {
  return new Promise((resolve) => {
    // 處理數據
    const arr = []
    for (const item of xianJson.features) {
      const positions = item.geometry.coordinates[0][0]
      for (const temp of positions) {
        const position = temp.concat(Math.random() * 1000 + 200)
        arr.push(position)
      }
    }
    option.series[0].data = arr
    resolve(option)
  })
}

const initAfter = (chart: {
  getModel: () => {
    (): any
    new (): any
    getComponent: { (arg0: string): { (): any; new (): any; getBMap: { (): any; new (): any } }; new (): any }
  }
}) => {
  // 添加百度地圖插件
  var bmap = chart.getModel().getComponent('bmap').getBMap()
  // 百度地圖樣式,需要自己去創建
  bmap.setMapStyleV2({
    styleId: 'bc05830a75e51be40a38ffc9220613bb'
  })
  // bmap.addControl(new BMap.MapTypeControl())
}
</script>

<template>
  <WChart width="100%" height="500px" :option="option" :initBefore="initBefore" :initAfter="initAfter" />
</template>

<style lang="scss" scoped></style>

image

文章作者:唯之為之

文章出處:https://www.cnblogs.com/weizwz/p/17933635.html

版權聲明:本博客所有文章除特別聲明外,均採用 「CC BY-NC-SA 4.0 DEED」 國際許可協議,轉載請註明出處!

內容粗淺,如有錯誤,歡迎大佬批評指正


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言: 繼上篇:Taurus .Net Core 微服務開源框架:Admin 插件【4-6】 - 配置管理-Mvc【Plugin-Doc 介面測試及文檔】 本篇繼續介紹下一個內容: 系統配置節點:Mvc - Plugin - Metric 介面調用次數統計: 配置界面如下: 1、Metric.IsE ...
  • 在Winform系統開發中,為了對系統的工具欄/菜單進行動態的控制,我們對系統的工具欄/菜單進行動態配置,這樣可以把系統的功能彈性發揮到極致。通過動態工具欄/菜單的配置方式,我們可以很容易的為系統新增所需的功能,通過許可權分配的方式,可以更有效的管理系統的菜單分配到不同的角色用戶,也就是插件化的處理方... ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是i.MXRT1170內部RAM的ECC初始化工作可全部由ROM完成。 痞子衡之前寫了三篇文章 《M7 FlexRAM ECC》、《M4 L-MEM ECC》、《MECC64》 分別介紹了 i.MXRT1170 片上 2MB RAM 的不 ...
  • 一.安裝anaconda3 前往清華園鏡像下載anaconda3的安裝包 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D 選擇最新鏡像Anaconda3-2023.09-0-Linux-x86_64.sh 安裝 1 bas ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是i.MXRT1170 MECC64功能特點及其保護片內OCRAM1,2之道。 ECC是 “Error Correcting Code” 的簡寫,ECC 能夠實現錯誤檢查和糾正,含有 ECC 功能的記憶體一般稱為 ECC 記憶體,使用了 EC ...
  • 本文在前一篇文章的基礎上,對進程執行監控工具(execsnoop)進行了升級,實時列印進程執行時傳入的參數列表;並通過 `kprobe` 和 `tracepoint` 兩種方式,綁定 eBPF 程式,給出了代碼實現。同時,對這兩種 eBPF 事件類型進行了簡單比較。顯然,在你手動開發一個 eBPF ... ...
  • jflashlite的燒寫速度要比mdk的燒寫速度快很多。雖然兩者底層都調用了jlink.exe,但是燒寫流程有區別。 MDK比較保守,不管怎麼樣先擦除扇區然後再執行寫入。 jflashlite比較靈活,先進行扇區校驗,如果不一致,才執行擦除和寫入。這會大大提升微小修改的程式燒寫時間。 當然你可以用 ...
  • Partial Update 數據打寬 通過不同的流寫不同的欄位,打寬了數據的維度,填充了數據內容;如下所示: --FlinkSQL參數設置 set `table.dynamic-table-options.enabled` = `true`; SET `env.state.backend` = ` ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...