首頁 > 軟體

Vue echarts範例專案商家銷量統計圖實現詳解

2022-09-26 14:02:41

總體效果如圖

元件結構設計

SellerPage.vue

<!--針對於/sellerpage 這條路徑顯示 測試顯示元件-->
<template>
<div class="comP1">
  <Seller></Seller>
</div>
</template>
<script>
  import Seller from "@/components/Seller";
  export default {
    name: "SellerPage",
    components:{Seller}
  }
</script>
<style scoped>
</style>

Seller.vue

<!-- 顯示商家銷量統計的圖表 -->
<template>
<div class="comP2" ref="seller_1"></div>
</template>
<script>
export default {
data () {
return {}
},
methods: {}
}
</script>
<style lang="less" scoped>
</style>

接下來就在 Seller.vue 搞事情了

在mounted生命週期中初始化 echartsInstance 物件

因為在元件掛載到頁面上 echarts 才能找到具體的DOM渲染

methods 裡定義 initChart 方法this.$refs.seller_1 找到具體盒子

this.theme 主題 來自於 Vuex 使用對映快捷引入

import {mapState} from "vuex";
computed:{
    ...mapState(['theme'])
},

然後就是設定設定項 在之前的基礎都有講到過

新增了柱狀圖漸變設定 可以詳看註釋

滑鼠移入和移出時間 用來停止和開啟定時器 後面會用到

      methods:{
     // 初始化echarts 範例物件
      initChart(){
        this.chartsInstance = this.$echarts.init(this.$refs.seller_1,this.theme)
        const initOption = {
            title:{
                text:'▎銷售業績統計',
                left:20,
                top:15
            },
            grid:{
                top: '24%',
                left: '3%',
                right:'6%',
                bottom:'3%',
                containLabel: true // 距離是包含座標軸上的文字
            },
            xAxis:{
                type:'value',
            },
            yAxis:{
                type: 'category',
            },
            tooltip:{
                trigger:'axis',
                axisPointer:{
                    type:'line',
                    z:0,
                    lineStyle:{
                        color:'#2d3443'
                    }
                }
            },
            series:[
                {
                    type:'bar', // 柱狀圖
                    label:{
                        show:true,// 顯示柱內數值
                        position:'right',// 數值顯示位置
                        textStyle: {
                            color:'#fff'// 數值顯示顏色
                        }
                    },
                    itemStyle:{
                        // 設定漸變 x1,y1,x2,y2(指明漸變的方向) [{指明不同百分比下顏色的值}]
                        color:new this.$echarts.graphic.LinearGradient(0,0,1,0,[
                            {
                                offset:0,
                                color:'#5052ee'
                            },
                            {
                                offset: 1,
                                color: '#ab6ee5'
                            }
                        ])
                    }
                },
            ]
        }
          this.chartsInstance.setOption(initOption)
        // 對圖表進行 滑鼠移入移出 事件的監聽
        this.chartsInstance.on('mouseover',()=>{
            clearInterval(this.timerID)
        })
        this.chartsInstance.on('mouseout',()=>{
            this.startInterval()
        })
      },
}

傳送請求獲取對應的資料並進行相應操作

使用到的data:

    data(){
      return{
        chartsInstance:null, 圖表的範例物件 初始化後賦值給它
        allData:null, 請求過來的資料
        currentPage:1, 當前頁碼 定時器進行改變 來擷取哪些資料展示
        totalPage:0, 總頁數
        timerID:null 定時器的ID 用於啟停 
      }
    },

直接使用 註冊的 axios =>$http.get 來獲取 並通過 async await 簡化 解構出來

進行 sort 排序操作

計算出 每頁顯示5條資訊的情況下 總頁數是多少 能被5整除就直接用 整除不了就再加一頁

     async getData(){
        const {data:res} = await this.$http.get('seller')
        this.allData = res
        // 對資料進行排序
        this.allData.sort((a,b) =>{
            return a.value - b.value // 從小到大排序
        })
        // 每五個資料 顯示一頁
        this.totalPage = this.allData.length % 5 === 0 ? this.allData.length / 5 : Math.floor(this.allData.length / 5) + 1
        this.updateChart()
        this.startInterval()
      }

資料和頁碼轉存到 data 裡了 可以更新設定 把圖表渲染出來

當期頁碼預設是1 就擷取 0-5的索引

在使用 map 生成新的陣列 用於 x軸 和 y軸

最後更新設定項 設定項會自動整合

     // 更新圖表
      updateChart(){
        const start = (this.currentPage - 1) * 5
        const end = this. currentPage * 5
        const showData = this.allData.slice(start,end) // slice 擷取 不包括 end
        const sellerNames = showData.map((item) =>{
          return item.name
        })
        const sellerValues = showData.map((item) =>{
          return item.value
        })
        const dataOption = {
            yAxis:{data:sellerNames},
            series:[{data:sellerValues}]
        }
        this.chartsInstance.setOption(dataOption)
      },

當第一頁的資料展示出來時就可以開啟定時器了

開始之前先清除之前的定時器(來回切換頁面後 回到最初的資料)

頁碼累計相加 到最大值再返回到1

改變 當前頁的同時 呼叫更新圖表資料的方法

滑鼠移入移出 啟停定時器的方法 在註冊範例的時候已經新增

      // 開啟定時器
      startInterval(){
          if (this.timerID){
              clearInterval(this.timerID)
          }
          this.timerID = setInterval(()=>{
              this.currentPage++
              if (this.currentPage > this.totalPage){
                  this.currentPage = 1
              }
              this.updateChart()
          },3600)
      },

小細節

xAxis:{
    type:'value',
    // 細節處理 固定x軸的最大值
    max:this.allData[this.allData.length -1].value
},

當視窗尺寸發生變化時的操作

自己定義一個 合適 簡易的 rem :當前視窗柵格化100份 * 3.6

根據這個資料 設定 標題大小 提示文字大小 柱狀圖的寬度和 圓角尺寸

初始化頁面時 呼叫一次 之後 跟隨視窗事件呼叫

mounted() {
  window.addEventListener('resize',this.screenAdapter)
  this.screenAdapter()
},
      // 當瀏覽器寬度發生變化時
      screenAdapter(){
        const titleFontSize = this.$refs.seller_1.offsetWidth / 100 * 3.6
        // 解析度改變時更新的設定
        const adapterOption = {
            title:{
                textStyle:{
                    fontSize: titleFontSize
                }
            },
            tooltip:{
                axisPointer:{
                    lineStyle:{
                        width:titleFontSize,
                    }
                }
            },
            series:[
                {
                    type:'bar', // 柱狀圖
                    barWidth:titleFontSize,// 柱狀寬度
                    itemStyle:{
                        barBorderRadius:[0,titleFontSize/2,titleFontSize/2,0],// 柱狀的圓角
                    }
                },
            ]
        }
        this.chartsInstance.setOption(adapterOption)
        this.chartsInstance.resize()
      }

到此這篇關於Vue echarts範例專案商家銷量統計圖實現詳解的文章就介紹到這了,更多相關Vue 銷量統計圖內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com