最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue3+vite+JS使用Echarts封裝一個餅圖完整代碼(父子組件聯(lián)動)

 更新時間:2026年03月13日 08:28:38   作者:還是大劍師蘭特  
在Vue中繪制餅圖有多種方式,其中最常用的是使用第三方圖表庫,如ECharts、Chart.js等,下面這篇文章主要介紹了vue3+vite+JS使用Echarts封裝一個餅圖(父子組件聯(lián)動)的相關(guān)資料,需要的朋友可以參考下

前言

本文要在vue3+vite+JS項目中,使用Echarts封裝一個餅圖子組件,父組件中引入子組件并傳入數(shù)據(jù)。傳入的數(shù)據(jù)包括標(biāo)題、高度、寬度、餅圖數(shù)據(jù),resize監(jiān)聽尺寸。子組件監(jiān)聽餅圖數(shù)據(jù)的變化,來更新子組件的顯示內(nèi)容。

一、實現(xiàn)思路

  1. 子組件封裝:基于 ECharts 封裝餅圖組件,接收父組件傳入的標(biāo)題、寬高、餅圖數(shù)據(jù)等 props;
  2. 響應(yīng)式處理:監(jiān)聽餅圖數(shù)據(jù)變化,自動更新圖表;監(jiān)聽窗口 resize 事件,自適應(yīng)調(diào)整圖表尺寸;
  3. 父組件使用:導(dǎo)入子組件,傳入自定義數(shù)據(jù),實現(xiàn)靈活配置。

二、完整代碼實現(xiàn)

1. 安裝 ECharts 依賴

npm install echarts --save
# 或 yarn add echarts

2. 餅圖子組件(PieChart.vue)

<template>
  <!-- 圖表容器,寬高由父組件傳入 -->
  <div 
    ref="chartRef" 
    class="pie-chart-container"
    :style="{ width: width + 'px', height: height + 'px' }"
  ></div>
</template>

<script setup>
import { ref, watch, onMounted, onUnmounted } from 'vue'
import * as echarts from 'echarts'

// 定義接收的 props
const props = defineProps({
  // 餅圖標(biāo)題
  title: {
    type: String,
    default: '餅圖示例'
  },
  // 圖表寬度(px)
  width: {
    type: Number,
    default: 400
  },
  // 圖表高度(px)
  height: {
    type: Number,
    default: 300
  },
  // 餅圖數(shù)據(jù)(格式:[{ name: '分類1', value: 100 }, ...])
  chartData: {
    type: Array,
    required: true,
    validator: (val) => {
      // 簡單校驗數(shù)據(jù)格式
      return val.every(item => item.hasOwnProperty('name') && item.hasOwnProperty('value'))
    }
  }
})

// 圖表實例引用
const chartRef = ref(null)
// ECharts 實例
let chartInstance = null

// 初始化圖表
const initChart = () => {
  // 確保容器存在
  if (!chartRef.value) return
  
  // 初始化 ECharts 實例
  chartInstance = echarts.init(chartRef.value)
  
  // 設(shè)置圖表配置項
  const option = {
    title: {
      text: props.title,
      left: 'center' // 標(biāo)題居中
    },
    tooltip: {
      trigger: 'item', // 鼠標(biāo)懸浮提示
      formatter: '{a} 
: {c} (wppm3vysvbp%)' // 提示格式:名稱:數(shù)值(百分比)
    },
    legend: {
      orient: 'vertical', // 圖例垂直排列
      left: 'left' // 圖例居左
    },
    series: [
      {
        name: props.title,
        type: 'pie',
        radius: ['40%', '70%'], // 餅圖內(nèi)外半徑
        avoidLabelOverlap: false,
        label: {
          show: false,
          position: 'center'
        },
        emphasis: {
          label: {
            show: true,
            fontSize: 16,
            fontWeight: 'bold'
          }
        },
        labelLine: {
          show: false
        },
        data: props.chartData // 餅圖數(shù)據(jù)
      }
    ]
  }
  
  // 渲染圖表
  chartInstance.setOption(option)
}

// 更新圖表(數(shù)據(jù)變化時調(diào)用)
const updateChart = () => {
  if (!chartInstance) return
  
  // 僅更新數(shù)據(jù)相關(guān)配置,避免重復(fù)初始化
  chartInstance.setOption({
    title: { text: props.title },
    series: [{ data: props.chartData }]
  })
}

// 監(jiān)聽窗口 resize,自適應(yīng)調(diào)整圖表尺寸
const handleResize = () => {
  if (chartInstance) {
    chartInstance.resize()
  }
}

// 生命周期:掛載時初始化圖表 + 監(jiān)聽 resize
onMounted(() => {
  initChart()
  window.addEventListener('resize', handleResize)
})

// 生命周期:卸載時銷毀實例 + 移除監(jiān)聽
onUnmounted(() => {
  if (chartInstance) {
    chartInstance.dispose() // 銷毀 ECharts 實例,釋放內(nèi)存
    chartInstance = null
  }
  window.removeEventListener('resize', handleResize)
})

// 監(jiān)聽 props 變化,更新圖表
watch(
  // 監(jiān)聽標(biāo)題、寬高、數(shù)據(jù)的變化
  [() => props.title, () => props.width, () => props.height, () => props.chartData],
  () => {
    // 寬高變化時先銷毀再重新初始化,數(shù)據(jù)/標(biāo)題變化時僅更新配置
    if (props.width || props.height) {
      chartInstance?.dispose()
      initChart()
    } else {
      updateChart()
    }
  },
  {
    deep: true // 深度監(jiān)聽數(shù)組/對象變化
  }
)
</script>

<style scoped>
.pie-chart-container {
  /* 防止容器內(nèi)邊距影響尺寸 */
  box-sizing: border-box;
  /* 解決圖表容器閃爍問題 */
  transition: all 0.3s ease;
}
</style>

3. 父組件(ParentPage.vue)

<template>
  <div class="parent-page">
    <h2>餅圖組件使用示例</h2>
    
    <!-- 操作區(qū):修改數(shù)據(jù)/尺寸 -->
    <div class="control-panel">
      <button @click="changeChartData">切換餅圖數(shù)據(jù)</button>
      <button @click="changeChartSize">修改圖表尺寸</button>
      <button @click="changeChartTitle">修改圖表標(biāo)題</button>
    </div>
    
    <!-- 引入餅圖子組件,傳入配置 -->
    <PieChart 
      :title="chartTitle"
      :width="chartWidth"
      :height="chartHeight"
      :chart-data="chartData"
    />
  </div>
</template>

<script setup>
import { ref } from 'vue'
// 導(dǎo)入餅圖子組件
import PieChart from './PieChart.vue'

// 定義餅圖配置數(shù)據(jù)(響應(yīng)式)
const chartTitle = ref('各部門人數(shù)分布')
const chartWidth = ref(500)
const chartHeight = ref(400)

// 初始餅圖數(shù)據(jù)
const chartData = ref([
  { name: '技術(shù)部', value: 30 },
  { name: '產(chǎn)品部', value: 15 },
  { name: '市場部', value: 20 },
  { name: '財務(wù)部', value: 8 },
  { name: '人事部', value: 7 }
])

// 模擬:切換餅圖數(shù)據(jù)
const changeChartData = () => {
  chartData.value = [
    { name: '技術(shù)部', value: 40 },
    { name: '產(chǎn)品部', value: 10 },
    { name: '市場部', value: 25 },
    { name: '財務(wù)部', value: 5 },
    { name: '人事部', value: 10 },
    { name: '運營部', value: 10 } // 新增分類
  ]
}

// 模擬:修改圖表尺寸
const changeChartSize = () => {
  chartWidth.value = 600
  chartHeight.value = 450
}

// 模擬:修改圖表標(biāo)題
const changeChartTitle = () => {
  chartTitle.value = '各部門人數(shù)分布(更新后)'
}
</script>

<style scoped>
.parent-page {
  padding: 20px;
}

.control-panel {
  margin-bottom: 20px;
}

.control-panel button {
  margin-right: 10px;
  padding: 8px 16px;
  border: none;
  border-radius: 4px;
  background: #409eff;
  color: #fff;
  cursor: pointer;
}

.control-panel button:hover {
  background: #66b1ff;
}
</style>

三、關(guān)鍵代碼解釋

  1. 子組件核心邏輯

    • props 定義:明確接收標(biāo)題、寬高、餅圖數(shù)據(jù),且對 chartData 做格式校驗,確保數(shù)據(jù)合法性;
    • 圖表初始化initChart 方法創(chuàng)建 ECharts 實例并配置基礎(chǔ)樣式,updateChart 方法僅更新數(shù)據(jù)/標(biāo)題,避免重復(fù)初始化;
    • 響應(yīng)式監(jiān)聽:通過 watch 深度監(jiān)聽 props 變化,寬高變化時重新初始化圖表,數(shù)據(jù)/標(biāo)題變化時僅更新配置;
    • 生命周期管理onMounted 時初始化圖表并添加 resize 監(jiān)聽,onUnmounted 時銷毀 ECharts 實例、移除監(jiān)聽,防止內(nèi)存泄漏;
    • resize 適配:監(jiān)聽窗口尺寸變化,調(diào)用 chartInstance.resize() 自動調(diào)整圖表大小。
  2. 父組件核心邏輯

    • 定義響應(yīng)式數(shù)據(jù)(標(biāo)題、寬高、餅圖數(shù)據(jù)),傳入子組件;
    • 提供按鈕模擬數(shù)據(jù)/尺寸/標(biāo)題變化,驗證子組件的響應(yīng)式更新能力。

四、使用注意事項

  1. 數(shù)據(jù)格式:父組件傳入的 chartData 必須是 [{ name: 'xxx', value: xxx }, ...] 格式,子組件已做基礎(chǔ)校驗;
  2. 內(nèi)存泄漏:子組件在 onUnmounted 中銷毀 ECharts 實例、移除 resize 監(jiān)聽,避免頁面卸載后殘留事件;
  3. 自適應(yīng)優(yōu)化:如果需要監(jiān)聽父容器尺寸變化(而非窗口),可結(jié)合 element-resize-detector 庫實現(xiàn);
  4. 樣式適配:子組件容器的寬高使用 px 單位,若需百分比,可修改 props 類型為 String(如 width: '100%')。

五、封裝總結(jié)

  1. 子組件封裝了 ECharts 餅圖的核心邏輯,通過 props 接收父組件配置,具備數(shù)據(jù)響應(yīng)式更新、窗口 resize 自適應(yīng)能力;
  2. 父組件可靈活傳入自定義數(shù)據(jù),通過修改響應(yīng)式數(shù)據(jù)即可觸發(fā)子組件更新,使用簡單;
  3. 關(guān)鍵優(yōu)化點:銷毀 ECharts 實例、移除事件監(jiān)聽,避免內(nèi)存泄漏;深度監(jiān)聽數(shù)據(jù)變化,保證圖表實時更新。

到此這篇關(guān)于vue3+vite+JS使用Echarts封裝一個餅圖(父子組件聯(lián)動)的文章就介紹到這了,更多相關(guān)vue3+vite+JS用Echarts封裝餅圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue 列表上下過渡效果的實例代碼

    Vue 列表上下過渡效果的實例代碼

    最近有個需求,一個列表上下移動要有簡單過渡效果。本文通過實例代碼給大家介紹Vue 列表上下過渡效果,需要的朋友可以參考下
    2019-06-06
  • 使用Vue3+ts?開發(fā)ProTable源碼教程示例

    使用Vue3+ts?開發(fā)ProTable源碼教程示例

    這篇文章主要為大家介紹了使用Vue3+ts?開發(fā)ProTable源碼示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • VSCode開發(fā)UNI-APP 配置教程及插件

    VSCode開發(fā)UNI-APP 配置教程及插件

    uni-app 是一個使用 Vue.js 開發(fā)所有前端應(yīng)用的框架,今天通過本文給大家分享VSCode開發(fā)UNI-APP 配置教程及插件推薦與注意事項,感興趣的朋友一起看看吧
    2021-08-08
  • Vue做一個簡單的隨機點名冊

    Vue做一個簡單的隨機點名冊

    這篇文章主要介紹的是如何用Vue做一個簡單的隨機點名冊,主要是做個簡單的點名器,不做樣式,需要的朋友可以參考一下,希望對你有所幫助
    2021-12-12
  • VueRouter導(dǎo)航守衛(wèi)用法詳解

    VueRouter導(dǎo)航守衛(wèi)用法詳解

    這篇文章主要介紹了VueRouter導(dǎo)航守衛(wèi)的詳細(xì)用法以及分類介紹,有興趣的朋友學(xué)習(xí)參考下吧。
    2017-12-12
  • vue項目build打包后部分樣式錯亂的解決

    vue項目build打包后部分樣式錯亂的解決

    這篇文章主要介紹了vue項目build打包后部分樣式錯亂的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • vue中如何實時監(jiān)聽本地存儲

    vue中如何實時監(jiān)聽本地存儲

    這篇文章主要介紹了vue中如何實時監(jiān)聽本地存儲,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 基于Vue+echarts編寫一個折線圖

    基于Vue+echarts編寫一個折線圖

    這篇文章主要為大家詳細(xì)介紹了如何利用Vue和Echarts實現(xiàn)繪制折線圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2023-05-05
  • VUE對Storage的過期時間設(shè)置,及增刪改查方式

    VUE對Storage的過期時間設(shè)置,及增刪改查方式

    這篇文章主要介紹了VUE對Storage的過期時間設(shè)置,及增刪改查方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 在Vuex使用dispatch和commit來調(diào)用mutations的區(qū)別詳解

    在Vuex使用dispatch和commit來調(diào)用mutations的區(qū)別詳解

    今天小編就為大家分享一篇在Vuex使用dispatch和commit來調(diào)用mutations的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09

最新評論

广州市| 松江区| 衡南县| 绥阳县| 道真| 长春市| 社旗县| 平山县| 淮北市| 宜良县| 宣威市| 罗山县| 和静县| 车致| 澄城县| 遵义市| 阜康市| 亳州市| 崇文区| 潜江市| 枣强县| 永平县| 兴宁市| 建瓯市| 江孜县| 新余市| 济南市| 滁州市| 南皮县| 信丰县| 金沙县| 卓资县| 英吉沙县| 阿合奇县| 教育| 邛崃市| 武安市| 嘉定区| 澄江县| 土默特左旗| 安新县|