一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - vue.js - 在vue項目中封裝echarts的步驟

在vue項目中封裝echarts的步驟

2021-12-20 16:17陌上兮月 vue.js

這篇文章主要介紹了在vue項目中封裝echarts的步驟,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下

為什么需要封裝echarts

  • 每個開發者在制作圖表時都需要從頭到尾書寫一遍完整的option配置,十分冗余
  • 在同一個項目中,各類圖表設計十分相似,甚至是相同,沒必要一直做重復工作
  • 可能有一些開發者忘記考慮echarts更新數據的特性,以及窗口縮放時的適應問題。這樣導致數據更新了echarts視圖卻沒有更新,窗口縮放引起echarts圖形變形問題

我希望這個echarts組件能設計成什么樣

  • 業務數據和樣式配置數據分離,我只需要傳入業務數據就行了
  • 它的大小要完全由使用者決定
  • 不會因為縮放出現變形問題,而是能很好地自適應
  • 有時候某個圖表的樣式可能有點不一樣,希望能保留自己配置樣式的靈活性
  • 無論傳入什么數據都能正確地更新視圖
  • 如果我傳入的數據為空,能展示一個空狀態

公共組件結構建議

當你把它書寫為一個公共組件時,我我希望它應該是這樣:將單獨機械的配置表獨立成一份文件,暴露一個必要的vue單文件,同時攜帶一份README說明文檔,當然,文檔里面需要有關于你寫的組件的使用示例和入參含義說明,這在大型項目中非常重要。

在vue項目中封裝echarts的步驟

vue單文件代碼

echart_pie完整代碼如下:

<template>
 <div class="chart"></div>
</template>

<script>
import { merge } from "lodash";
import echart from "echarts";
import { BASIC_OPTION } from "./default_option";
import { COLOR_ARRAY } from "../color";
import ResizeListener from "element-resize-detector";

export default {
 name: "ChartPie",
 props: {
  seriesData: {
   type: Array,
   required: true,
   default: () => []
  },
  extraOption: {
   type: Object,
   default: () => ({})
  }
 },
 data() {
  return {
   chart: null
  };
 },
 watch: {
  seriesData: {
   deep: true,
   handler() {
    this.updateChartView();
   }
  }
 },
 mounted() {
  this.chart = echart.init(this.$el);
  this.updateChartView();
  window.addEventListener("resize", this.handleWindowResize);
  this.addChartResizeListener();
 },
 beforeDestroy() {
  window.removeEventListener("resize", this.handleWindowResize);
 },
 methods: {
  /**
   * 將業務數據加入到基礎樣式配置中
   * @returns {Object} 完整的echart配置
   */
  assembleDataToOption() {
   const formatter = name => {
    const total = this.seriesData.reduce((acc, cur) => acc + cur.value, 0);
    const data = this.seriesData.find(item => item.name === name) || {};
    const percent = data.value
     ? `${Math.round((data.value / total) * 100)}%`
     : "0%";

    return `{a|${name}}{b|${percent}}`;
   };

   return merge(
    {},
    BASIC_OPTION,
    { color: COLOR_ARRAY },
    {
     legend: { formatter },
     series: [{ data: this.seriesData }]
    },
    this.extraOption
   );
  },

  /**
   * 對chart元素尺寸進行監聽,當發生變化時同步更新echart視圖
   */
  addChartResizeListener() {
   const instance = ResizeListener({
    strategy: "scroll",
    callOnAdd: true
   });

   instance.listenTo(this.$el, () => {
    if (!this.chart) return;
    this.chart.resize();
   });
  },

  /**
   * 更新echart視圖
   */
  updateChartView() {
   if (!this.chart) return;

   const fullOption = this.assembleDataToOption();
   this.chart.setOption(fullOption, true);
  },

  /**
   * 當窗口縮放時,echart動態調整自身大小
   */
  handleWindowResize() {
   if (!this.chart) return;
   this.chart.resize();
  }
 }
};
</script>

<style lang="less" scoped>
.chart {
 width: 100%;
 height: 100%;
}
</style>

index完整代碼如下:

<template>
 <van-empty v-if="isSeriesEmpty" />
 <chart-pie v-else v-bind="$props" />
</template>

<script>
import { isEmpty } from "lodash";
import ChartPie from "./echart_pie.vue";

export default {
 name: "EchartPie",
 components: { ChartPie },
 props: ChartPie.props,
 computed: {
  isSeriesEmpty() {
   return (
    isEmpty(this.seriesData) || this.seriesData.every(item => !item.value)
   );
  }
 }
};
</script>

關于源碼的說明

  • 在源碼中,我用到了lodash的一個公共函數merge,它表示遞歸合并來源對象自身和繼承的可枚舉屬性到目標對象。后續的來源對象屬性會覆蓋之前同名的屬性
  • 另外一個有幸被我寵幸的函數是isEmpty,當我傳入的業務數據為空時,比如空數組[]、undefined、null時,都會被認為這是一個無數據的情況,這時候我們就展示一個空狀態的組件,它可能由一張背景圖構成;
  • 在綁定到具體的DOM元素時,我沒有用querySelector選擇器去選擇一個類或者是用Math.random生成的id,因為這兩者都不是絕對可靠的,我直接使用當前vue示例關聯的根DOM 元素$el
  • 我監聽窗口大小的變化,并為這種情況添加對應的事件處理函數--echarts自帶的resize方法,使echarts圖形不會變形
  • 將對應DOM的寬高設為100%,讓其大小完全由使用者提供的容器控制
  • setOption方法的第二個參數表示傳入的新option是否不與之前的舊option進行合并,默認居然是false,即合并。這顯然不行,我們需要每次的業務配置都是完全獨立的
  • 命名非常語義化,一看就懂
  • 保留了自己需要單獨配置一些定制樣式的靈活性,即extraOption

default_option.js應該包括哪些內容

正常情況下暴露一個基礎配置BASIC_OPTION就可以了
element-resize-detector是干啥的?
這是一個用于監聽DOM元素尺寸變化的插件。我們已經對窗口縮放做了監聽,但是有時候其父級容器的大小也會動態改變的。

我們對父級容器的寬度進行監聽,當父級容器的尺寸發生變化時,echart能調用自身的resize方法,保持視圖正常。

當然,這個不適用于tab選項卡的情況,在tab選項卡中,父級容器從display:none到有實際的clientWidth,可能會比注冊一個resizeDetector先完成,所以等開始監聽父級容器resize的時候,可能為時已晚。

在tab選項卡中很容易出現這種場景:

在vue項目中封裝echarts的步驟

看起來非常的逗,只有一點點大。解決這個問題,最有效的方法還是在切換選項卡時手動去通過ref獲取echart實例,并手動調用resize方法,這是最安全的,也是最有效的。

組件使用示例

<template>
<div class="echart-pie-wrap">
 <echart-pie :series-data="dataList" :extra-option="extraOption" />
</div>
</template>

<script>
import EchartPie from "@/components/echarts/echart_pie";

export default{
 components: { EchartPie },
 data() {
  return {
   dataList: [
    {
     name: "西瓜",
     value: 20
    },
    {
     name: "橘子",
     value: 13
    },
    {
     name: "楊桃",
     value: 33
    }
   ],
   extraOption: {
     color: [ "#fe883a", "#2d90d1","#f75981", "#90e2a9"]
   }
  }
 }
}

</script>

<style lang="less" scoped>
.echart-wrapper {
 width: 300px;
 height: 300px;
 margin: 10px auto;
}
</style>

效果圖

當數據正常時,效果如下

在vue項目中封裝echarts的步驟

當無數據時,效果如下

在vue項目中封裝echarts的步驟

關于靈活性

這里面提供的封裝只是一種大概的思路,實際項目中,可能會與這里出現偏差。軟件開發沒有銀彈可言,非常適合我這個項目的,可能在細節上不太適合看這篇文章的你。但是思路是類似的,可以對照著做一些調整。

以上就是在vue項目中封裝echarts的步驟的詳細內容,更多關于vue項目中封裝echarts的資料請關注服務器之家其它相關文章!

原文鏈接:https://www.cnblogs.com/zhangnan35/p/12680038.html

延伸 · 閱讀

精彩推薦
  • vue.jsVue多選列表組件深入詳解

    Vue多選列表組件深入詳解

    這篇文章主要介紹了Vue多選列表組件深入詳解,這個是vue的基本組件,有需要的同學可以研究下...

    yukiwu6752022-01-25
  • vue.js用vite搭建vue3應用的實現方法

    用vite搭建vue3應用的實現方法

    這篇文章主要介紹了用vite搭建vue3應用的實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下...

    Asiter7912022-01-22
  • vue.js梳理一下vue中的生命周期

    梳理一下vue中的生命周期

    看過很多人講vue的生命周期,但總是被繞的云里霧里,尤其是自學的同學,可能js的基礎也不是太牢固,聽起來更是吃力,那我就已個人之淺見,以大白話...

    CRMEB技術團隊7992021-12-22
  • vue.jsVue中引入svg圖標的兩種方式

    Vue中引入svg圖標的兩種方式

    這篇文章主要給大家介紹了關于Vue中引入svg圖標的兩種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的...

    十里不故夢10222021-12-31
  • vue.jsVue項目中實現帶參跳轉功能

    Vue項目中實現帶參跳轉功能

    最近做了一個手機端系統,其中遇到了父頁面需要攜帶參數跳轉至子頁面的問題,現已解決,下面分享一下實現過程,感興趣的朋友一起看看吧...

    YiluRen丶4302022-03-03
  • vue.js詳解vue 表單綁定與組件

    詳解vue 表單綁定與組件

    這篇文章主要介紹了vue 表單綁定與組件的相關資料,幫助大家更好的理解和學習使用vue框架,感興趣的朋友可以了解下...

    Latteitcjz6432022-02-12
  • vue.jsVue2.x-使用防抖以及節流的示例

    Vue2.x-使用防抖以及節流的示例

    這篇文章主要介紹了Vue2.x-使用防抖以及節流的示例,幫助大家更好的理解和學習使用vue框架,感興趣的朋友可以了解下...

    Kyara6372022-01-25
  • vue.jsVue2.x 項目性能優化之代碼優化的實現

    Vue2.x 項目性能優化之代碼優化的實現

    這篇文章主要介紹了Vue2.x 項目性能優化之代碼優化的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋...

    優小U9632022-02-21
主站蜘蛛池模板: 久久国产加勒比精品无码 | 日韩精品中文字幕久久 | 成人国产精品一级毛片视频 | 久久电影午夜 | 草莓香蕉绿巨人丝瓜榴莲污在线观看 | 欧美涩区 | 日本www午夜色在线视频 | 久久国产精品永久免费网站 | 2021国产麻豆剧传媒剧情动漫 | 国产老肥熟xxxx | ass亚洲熟妇毛茸茸pics | 91欧美秘密入口 | 免费高清在线视频色yeye | 乌克兰肥熟 | 亚洲欧美日本在线观看 | 国产精品美女久久久久 | 九九365资源稳定资源站 | 欧美视频在线播放观看免费福利资源 | 亚洲精品国产国语 | 国产视频播放 | 日本一区二区视频免费播放 | 秋葵丝瓜茄子草莓榴莲樱桃 | 18videossex性欧美69 | 四虎影视网址 | 亚洲va国产日韩欧美精品色婷婷 | 成人影院免费看 | 天堂网在线.www天堂在线资源 | 亚洲国产麻豆 | 日本免费看 | 国产区成人精品视频 | luan小说 | 国产高清在线不卡 | 国产精品日韩欧美一区二区三区 | 国产91第一页 | 3p文两男一女办公室高h | 2021最新国产成人精品视频 | 大象传媒1234区 | 日本漫画工囗全彩番在线 | 日本色午夜 | 精品视频一区二区三区 | 91免费永久在线地址 |