欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在Vue中使用echarts的實例代碼(3種圖)

 更新時間:2017年07月10日 15:30:07   作者:Mr_Treasure  
本篇文章主要介紹了在Vue中使用echarts的實例代碼(3種圖),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

公司的項目中需要對數(shù)據(jù)做可視化處理,高級點的D3.js目前還沒接觸到,因此選用了大眾化的Echarts, 在vue的生態(tài)系統(tǒng)中已經(jīng)有實現(xiàn)好的vue-echarts,但是使用現(xiàn)成的就意味著必須使用它定制好的數(shù)據(jù)結(jié)構(gòu),我也沒辦法對他進行一些修改。我個人也偏向于原生JS編程,因此沒有采用,而是自己在vue中實現(xiàn)了對數(shù)據(jù)的可視化處理,先來看看效果圖

以下數(shù)據(jù)已做脫敏處理



這是目前用到的三種圖。

可以看到,我在圖表的外部添加了標題及說明,以及右側(cè)的選擇框組件,視圖可以根據(jù)選擇的不同,圖表進行動態(tài)切換(echarts也是數(shù)據(jù)驅(qū)動),這就是個人定制化的好處

總體數(shù)據(jù)流向

所有的數(shù)據(jù)都是動態(tài)獲取的,由前端向后臺請求。當然請求數(shù)據(jù)肯定不會放在圖表組件中,而是放在了外部。因為架構(gòu)設計的不合理(MD前端就我一個人?。?,因此前期獲取數(shù)據(jù)及存取數(shù)據(jù)的方式,和后期也較大的不同。

1. 存放在vuex中

這么大型的項目,vuex少不了。在前面的組件中,一次請求數(shù)據(jù),然后將數(shù)據(jù)存儲到了vuex中,echarts組件再從vuex中獲取數(shù)據(jù)。這樣的做法可能代碼要稍微復雜點,但是數(shù)據(jù)存儲在vuex中是隨時可見的,我們也能隨時保存獲取的結(jié)果,對這些數(shù)據(jù)可以添加收藏也可以加入緩存中,下次再請求可以先從緩存調(diào)用。
(然而這只是我前端的想法,后臺已經(jīng)實現(xiàn)了對請求數(shù)據(jù)的緩存)

2. 存放在組件中,再分派到echarts組件

再對數(shù)據(jù)進行還原的時候(我的收藏,最近瀏覽),因為不需要保存或者收藏數(shù)據(jù),我就直接用一個父組件請求,然后再分發(fā)到echarts組件,這樣沒有經(jīng)過vuex,代碼想多要少些。

組件代碼

<template>
 <div class="r-echarts-line">
  <div class="top">
   <div class="title">
    {{origin.title}}
   </div>
   <div class="select-list">
    <Select style="width:120px;margin-right:.5rem" v-model="pagePick">
     <Option v-for="item in origin.page_select" :key="item" :value="item.val">{{item.name}}</Option>
    </Select>
    <Select style="width:120px" v-model="typePick">
     <Option v-for="item in typeList" :value="item.name" :key="item">{{item.name}}</Option>
    </Select>
   </div>
  </div>
  <div class="des">說明:符合于本次篩選條件的共有<span class='tips'>{{origin.desc}}</span>條<span style="font-weight:700;color:black">職位信息</span>。</div>
  <div class="bottom" id="echart" ref="mychart">

  </div>
 </div>
</template>

這是組件的html部分,可以看見top以及des是我自己添加的,bottom才是核心,也是整個echarts展示的部分,注意這里添加了ref,在script的代碼中,我們將通過這個鉤子,將DOM掛載到echarts中

<script>
// echarts相關(guān)
let echarts = require('echarts/lib/echarts');
require('echarts/lib/chart/bar');
require('echarts/lib/component/tooltip');
require('echarts/lib/component/toolbox');
require('echarts/lib/component/legend');
require('echarts/lib/component/markLine');

export default {
 name: 'r-echarts-line',
 data () {
  return {
  typePick: '數(shù)值',
  typeList: [
   {
    name: '數(shù)值'
   },
   {
    name: '百分比'
   }
  ],
  pagePick: 0,
  // myChart實例
   myChart: {},
   percent: {
    label: {
     normal: {
      show: true,
      position: 'inside',
      formatter: '{c}%'
     }
    }
   },
   numeric: {
    label: {
     normal: {
      show: true,
      position: 'inside',
      formatter: '{c}'
     }
    }
   }
  }
 },
 props: {
  index: {
   required: true,
   type: Number
  },
  data: {
   required: true,
   type: Object
  }
 },
 mounted () {
  this.setEchart();
 },
 updated () {
  if (!this.myChart) {
   this.setEchart();
  }
  this.chartChange();
 },
 computed: {
  origin () {
   return this.data;
  },
  opt() {
   let that = this;
   let obj = {
    color: ['#606c94'],
    tooltip: {
    },
    toolbox: {
      show: true,
      feature: {
        saveAsImage: {show: true}
      }
    },
    label: {
     normal: {
      show: true,
      position: 'inside',
      formatter: '{c}'
     },
     emphasis: {
      show: true
     }
    },
    xAxis: {
     type: 'value',
    },
    yAxis: {
     data: that.origin[that.type][that.pagePick].key,
     axisLabel: {
      interval: 0,
      rotate: -30
     }
    },
    series: [{
     name: that.origin.title,
     type: 'bar',
     data: that.origin[that.type][that.pagePick].val,
     barMaxWidth: '30',
     markLine: {
      data: [
       {type: 'average', name: '平均值'}
      ]
     }
    }]
   }
   return obj;
  },
  type () {
   if (this.typePick == '數(shù)值') {
    return 'numeric';
   } else if (this.typePick == '百分比') {
    return 'percent';
   } else {
    return 'numeric';
   }
  }
 },
 methods: {
  setEchart () {
   let dom = this.$refs.mychart;
   this.myChart = echarts.init(dom);
   this.myChart.setOption(this.opt);
  },
  chartChange () {
   this.myChart.setOption(this.opt);
   if (this.typePick == '百分比') {
    this.myChart.setOption(this.percent);
   }
   if (this.typePick == '數(shù)值') {
    this.myChart.setOption(this.numeric);
   }
  }
 }
}
</script>

首先我引入了需要的echarts組件,這個部分通過npm i echarts -S添加。

接著data部分我設置了那些將會引起變化的參數(shù)。需要注意的是,我并沒有將echarts的opt部分寫入到data中,因為整個圖表是基于數(shù)據(jù)驅(qū)動的,并且隨時會發(fā)生變化,因此我將opt設置為計算屬性computed,這樣opt將會根據(jù)我的選擇動態(tài)變化,echarts也將動態(tài)響應,mychart用于接收echarts生成的圖表實例,再參數(shù)變換的時候?qū)鹱饔谩?/p>

props部分是我接收到的參數(shù),這個組件時基于前面我講的第二種方式——父組件獲取數(shù)據(jù)分發(fā),data是父組件分發(fā)給echarts的數(shù)據(jù)源。

暫時忽略兩個Vue生命周期鉤子, 后面講

計算屬性中設置了兩個屬性,origin和opt,注意這個origin很重要,通過它我將opt項與復雜的數(shù)據(jù)解耦,無論外面的數(shù)據(jù)怎么換,opt只關(guān)心origin的值,而這個opt在兩種數(shù)據(jù)獲取的方式中是不一樣的,使用vuex的方式,origin將會直接從vuex中獲取數(shù)據(jù)。這樣一定程度上也實現(xiàn)了組件的復用。

opt就是該圖表組件的設置項了,這個參數(shù)按照官網(wǎng)給的配置,自己搭配即可。

接下來是methods部分,setEchart將會完成對整個圖表的初始化,通過this.$refs獲取DOM實例,再由echars生成實例并綁定在data中的mychart選項。

chartChange是用來響應我自定義組件的變化的,針對選框的不同將會有不同的顯示情況。在這里是百分比和數(shù)據(jù)的切換

接著是前面忽略的生命周期部分

mounted里使用setEchart方法,初始化圖表組件,一定要在這里使用該方法,否則會找不到DOM

updated周期里是響應參數(shù)變化的方法,首先檢測該實例有沒有生成(單頁應用因為用戶可能存在的誤操作,很可能導致實例沒有生成,這里檢測是很有必要的),接著在vue中的數(shù)據(jù)發(fā)生改變時運行chartChange方法,注意,我的選擇框是沒有綁定事件的,只是通過v-model改變了參數(shù),然后opt動態(tài)響應了參數(shù)的變化。當opt的參數(shù)變化的時候,updated中的方法就會執(zhí)行,echarts也會動態(tài)響應。這個就是使用基于數(shù)據(jù)驅(qū)動vue最精巧的地方,避免了通過事件調(diào)用echartChange方法。也是vue中使用echarts核心的一環(huán)

另外還有一個就是獲取地圖參數(shù)的,并不用在官網(wǎng)里下載,提供的npm包里就有,按需引用就好了(使用官網(wǎng)的js版本會報錯沒找到echarts)

import echarts from 'echarts/lib/echarts';
import 'echarts/lib/chart/map';
import 'echarts/map/js/china.js';

style部分就沒什么好聊的了,只需要記住一點,必須顯式指定加載echarts 的DOM的寬度和高度

父組件對echarts組件的調(diào)用

調(diào)用組件的方法按照常規(guī)組件調(diào)用就好了,只是因為echarts加載數(shù)據(jù)繪制需要耗費不少時間,我們可能需要通過keep-alive保存組件在內(nèi)存中,避免切出去的時候被釋放了。另外可能一個頁面需要展示多個echarts類型組件,這里考慮使用component動態(tài)組件

<template>
 <div class="focus-echarts-wrap">
  <keep-alive>
   <component :is="currentView" :index="focusType"></component>
  </keep-alive>
 </div>
</template>

其他問題

在生成柱狀圖和餅狀圖的時候,加載時間并不算太慢。只是在加載地圖類型的時候,尤其是我在生成中國地圖的時候,達到了10s+的延遲,并且阻塞的是主線程,這段時間用戶是無法操作的,相當于卡頓的情況。

該數(shù)據(jù)是在32bit的QQ瀏覽器上測得的,同事用的64bit的谷歌瀏覽器會好一點。

初步判斷是echarts的問題。當然也因為是在dev模式下,可能和我打開了vuex和事件的監(jiān)測有關(guān)。具體的延遲時間我會在線上版本測試,希望情況會好轉(zhuǎn)吧。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • AntV F2和vue-cli構(gòu)建移動端可視化視圖過程詳解

    AntV F2和vue-cli構(gòu)建移動端可視化視圖過程詳解

    這篇文章主要介紹了AntV F2和vue-cli構(gòu)建移動端可視化視圖過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • 解決vue 項目引入字體圖標報錯、不顯示等問題

    解決vue 項目引入字體圖標報錯、不顯示等問題

    今天小編就為大家分享一篇解決vue 項目引入字體圖標報錯、不顯示等問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • Vue中router-view和component :is的區(qū)別解析

    Vue中router-view和component :is的區(qū)別解析

    這篇文章主要介紹了Vue中router-view和component :is的區(qū)別解析,router-view用法直接填寫跳轉(zhuǎn)路由,路由組件會渲染<router-view></router-view>標簽,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • 關(guān)于vue中的時間格式轉(zhuǎn)化問題

    關(guān)于vue中的時間格式轉(zhuǎn)化問題

    這篇文章主要介紹了關(guān)于vue中的時間格式轉(zhuǎn)化問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 詳解vue axios中文文檔

    詳解vue axios中文文檔

    本篇文章主要介紹了詳解axios中文文檔,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Vue3的效率提升主要表現(xiàn)在哪些方面示例解析

    Vue3的效率提升主要表現(xiàn)在哪些方面示例解析

    Vue3帶來了許多性能優(yōu)化和效率提升的特性,本文將重點討論Vue3在靜態(tài)提升、預字符串化、緩存事件處理函數(shù)、Block?Tree和PatchFlag方面的改進,我們將通過對比Vue2和Vue3的編譯結(jié)果來說明這些方面的效率提升
    2023-12-12
  • Vue?mergeProps用法詳細講解

    Vue?mergeProps用法詳細講解

    這篇文章主要介紹了Vue?mergeProps用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-10-10
  • vue中更改數(shù)組中屬性,在頁面中不生效的解決方法

    vue中更改數(shù)組中屬性,在頁面中不生效的解決方法

    今天小編就為大家分享一篇vue中更改數(shù)組中屬性,在頁面中不生效的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • vue自定義組件如何通過v-model指令控制組件的隱藏、顯示

    vue自定義組件如何通過v-model指令控制組件的隱藏、顯示

    這篇文章主要介紹了vue自定義組件如何通過v-model指令控制組件的隱藏、顯示,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • element-plus中el-upload組件限制上傳文件類型的方法

    element-plus中el-upload組件限制上傳文件類型的方法

    ?Element Plus 中,el-upload 組件可以通過設置 accept 屬性來限制上傳文件的格式,這篇文章主要介紹了element-plus中el-upload組件限制上傳文件類型,需要的朋友可以參考下
    2024-02-02

最新評論